209. Minimum Size Subarray Sum
来源:互联网 发布:美国银行业数据 编辑:程序博客网 时间:2024/06/05 11:20
Given an array of n positive integers and a positive integer s, find the minimal length of a contiguous subarray of which the sum ≥ s. If there isn’t one, return 0 instead.
For example, given the array [2,3,1,2,4,3] and s = 7,
the subarray [4,3] has the minimal length under the problem constraint.
方法一:
brute-force, O(n^2)。不解释
int minSubArrayLen(int s, vector<int>& nums) { int i, j, sum; int minlen = INT_MAX; for (i = 0; i < nums.size(); i++) { sum = 0; for (j = i; j < nums.size(); j++) { sum += nums[j]; if (sum >= s) { minlen = min(minlen, j - i + 1); break; } } } if (minlen == INT_MAX) { return 0; } else return minlen;}
方法二:binary search
binary search必须在有序数组上进行,当对原始数据的连续性有要求时,不能在原有基础上sorting。但是累加求和确是一种构造非递减数列的有效方法,前提是数组里都是非负数。这里就是如此。我们可以在求和之后将所有的和存起来,然后将问题转化为寻找sum[i] + s 的lower bound的问题,这里就可以用binary search将原本O(n)的复杂度降到O(logn).
代码:
int minSubArrayLen(int s, vector<int>& nums) { int i, j; int minlen = INT_MAX; int len = nums.size(); vector<int> sum(len + 1, 0); for (i = 1; i <= len; i++) { sum[i] = sum[i - 1] + nums[i - 1]; } for (i = 1; i <= len; i++) { int to_find = sum[i - 1] + s; j = binary_search(sum, to_find, i, len); if (j == -1) break; else minlen = min(minlen, j - i + 1); } return minlen == INT_MAX ? 0 : minlen;}int binary_search(vector<int>& sum, int to_find, int st, int ed) { if (st > ed) return -1; if (st == ed) { return sum[st] >= to_find ? st : -1; } int mid = (st + ed) / 2; if (to_find == sum[mid]) { return mid; } else if (to_find < sum[mid]) { return binary_search(sum, to_find, st, mid); } else { return binary_search(sum, to_find, mid + 1, ed); }}
这里也可以直接用STL 库函数,lower_bound。返回有序数组里第一个大于等于to_find的数。
upper_bound是返回第一个大于to_find 的数。
方法三:滑动窗法
上述两种都是在固定starting index后逐一确定。其实对每个starting index有相当大的重复操作。
这里可以用两个指针,two pointers. 维持左右边界。非常简便。
int minSubArrayLen(int s, vector<int>& nums) { int left = 0, right = 0; int minlen = INT_MAX; int len = nums.size(); int sum = 0; for (right = 0; right < len; right++) { sum += nums[right]; while (sum >= s) { minlen = min(minlen, right - left + 1); sum -= nums[left++]; } } return minlen == INT_MAX ? 0 : minlen;}
- 209.Minimum Size Subarray Sum
- 209.Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- Reddit热门话题:你是否也对NLP的发展状态感到失望?
- 详解可视化利器 t-SNE 算法:数无形时少直觉
- Uber命运如此多舛的当口,软银砸了几十亿美金给它「冲喜」
- 其实,Face ID只是iPhone X TrueDepth相机的冰山一角
- 视频:这是一群极客与梦想家的无人驾驶奋斗之旅
- 209. Minimum Size Subarray Sum
- 转载自SkySoot的JSON数据格式
- 超越Softmax瓶颈:一种高秩RNN语言模型
- 让机器像人一样交流:斯坦福李纪为博士毕业论文
- 对比ResNet: 超深层网络DiracNet的PyTorch实现
- 软件开发中,那些被视而不见的大问题
- CTF各种方向入门
- Xcode9学习笔记53
- Mybatis学习注意点