**Leetcode 209. Minimum Size Subarray Sum | 区间和符合条件 = k

2024-05-28 03:48

本文主要是介绍**Leetcode 209. Minimum Size Subarray Sum | 区间和符合条件 = k,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://leetcode.com/problems/minimum-size-subarray-sum/description/

O(n)可解

class Solution {
public:int minSubArrayLen(int s, vector<int>& nums) {if (nums.size()==0 || s == 0) return 0;int cur = nums[0], left = 0, right = 0;int ret = nums.size() + 1;while (right < nums.size()){if (cur >= s) {ret = min(ret, right - left + 1);cur -= nums[left];left++;} else {right ++;cur += nums[right]; }}        return ret == nums.size() + 1 ? 0 : ret;}
};

另外拿这个题当二分联系了,二分长度

class Solution {
public:int minSubArrayLen(int s, vector<int>& nums) {int cur = 0, left = 0,   l = 0, r = nums.size(), get = 0;for (int i = 0; i < nums.size(); i++) cur += nums[i];if (cur<s) return 0;while (l < r) {int mid ;mid =l + ((r - l )>>1);bool check = false;for (left=0; left + mid -1 < nums.size(); left++) {if (left == 0) {cur = 0;for (int i = left; i < left + mid; i++) {cur += nums[i];}} else {cur -= nums[left-1];cur += nums[left + mid -1];}if (cur >= s) {check = true;get = 1;break;} }if (check) {r = mid;} else {l = mid + 1;}}if (get) return r; else return nums.size();}
};

这个可以作为模板,注意点就是 r=mid这种写法,当长度为1的时候,必须是做端点,对应上面mid的写法。

为了防止死循环,每次代入l=2 r=3检查一次


这篇关于**Leetcode 209. Minimum Size Subarray Sum | 区间和符合条件 = k的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1009465

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

最大流=最小割=最小点权覆盖集=sum-最大点权独立集

二分图最小点覆盖和最大独立集都可以转化为最大匹配求解。 在这个基础上,把每个点赋予一个非负的权值,这两个问题就转化为:二分图最小点权覆盖和二分图最大点权独立集。   二分图最小点权覆盖     从x或者y集合中选取一些点,使这些点覆盖所有的边,并且选出来的点的权值尽可能小。 建模:     原二分图中的边(u,v)替换为容量为INF的有向边(u,v),设立源点s和汇点t

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

hdu4267区间统计

题意:给一些数,有两种操作,一种是在[a,b] 区间内,对(i - a)% k == 0 的加value,另一种操作是询问某个位置的值。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import

hdu4417区间统计

给你一个数列{An},然后有m次查询,每次查询一段区间 [l,r] <= h 的值的个数。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamRead

hdu3333区间统计

题目大意:求一个区间内不重复数字的和,例如1 1 1 3,区间[1,4]的和为4。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点