LeetCode OJ 209. Minimum Size Subarray Sum
Given an array of n positive integers and a positive integer s, find the minimal length of a 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.
If you have figured out the O(n) solution, try coding another solution of which the time complexity is O(n log n).
Credits:
Special thanks to @Freezen for adding this problem and creating all test cases.
【题目分析】
给定一个由n个正数组成的数组一个目标值s,找到大于等于目标值的最短子数组的长度,如果不存在就返回0。
【思路】
1. 时间复杂度为O(n)
为了找到最小的子数组,并且子数组元素的和值要大于等于s,我们要找到子数组的起始点和终止节点。假设我们已经找到了一个满足条件的子数组,下一步该怎么办呢?
为了使得数组的长度最短,我们要把起始点向后移动,如果还满足条件就继续向后移动。如果条件不满足了,我们就把终止节点向后移动,然后重复上面的过程。举个例子如下:nums: [2,3,1,2,4,3],s=7。
(1)begin=0, end=0, sum=2,minlen=nums.length+1; 此时sum<7,end向后移动。

(2)sum=5,end继续向后移动。

(3)sum=6,end继续向后移动。

(4)sum=8,begin向后移动,minlen=4。

(5)sum=6,end向后移动。

(6)sum=9,begin向后移动,minlen=4。

(7)sum=7,begin继续向后移动,minlen=3。

(8)sum=6,end向后移动。

(9)sum=9,begin向后移动,minlen=3.

(10)sum=7,begin向后移动,minlen=2.

(11)结束,返回2.

2. 时间复杂度为nO(logn)
As to NLogN solution, logN immediately reminds you of binary search. In this case, you cannot sort as the current order actually matters. How does one get an ordered array then? Since all elements are positive, the cumulative sum must be strictly increasing. Then, a subarray sum can expressed as the difference between two cumulative sum. Hence, given a start index for the cumulative sum array, the other end index can be searched using binary search.
由于数组中所有元素是正数,因此向后累加的和值肯定是递增的。一个子数组的和可以表示为两个不同位置数组累加和的差值。所以我们构造一个数组累加和的数组,然后使用二分查找来解决这个问题。
例如 nums:[2,3,1,2,4,3],s=7。累加和数组sums:[0,2,5,6,8,12,15].
我们遍历sums数组,对于每一个元素sum[i],向后找到第一个比sums[i]+s大的元素,然后计算此时的minlen的长度。返回最小的即可。
【java代码1】O(N)
public class Solution {
public int minSubArrayLen(int s, int[] nums) {
if(nums == null || nums.length == 0) return 0;
int begin = 0, end = 0;
int sum = nums[0], minlen = nums.length + 1;
while(end < nums.length){
if(sum < s){
if(end < nums.length-1)
sum += nums[++end];
else break;
}
else{
minlen = Math.min(minlen, end-begin+1);
sum = sum - nums[begin++];
}
}
return minlen <= nums.length ? minlen : 0;
}
}
【java代码1】NO(logN)
public class Solution {
public int minSubArrayLen(int s, int[] nums) {
int[] sums = new int[nums.length + 1];
for (int i = 1; i < sums.length; i++) sums[i] = sums[i - 1] + nums[i - 1];
int minLen = Integer.MAX_VALUE;
for (int i = 0; i < sums.length; i++) {
int end = binarySearch(i + 1, sums.length - 1, sums[i] + s, sums);
if (end == sums.length) break;
if (end - i < minLen) minLen = end - i;
}
return minLen == Integer.MAX_VALUE ? 0 : minLen;
}
private int binarySearch(int lo, int hi, int key, int[] sums) {
while (lo <= hi) {
int mid = (lo + hi) / 2;
if (sums[mid] >= key){
hi = mid - 1;
} else {
lo = mid + 1;
}
}
return lo;
}
}
LeetCode OJ 209. Minimum Size Subarray Sum的更多相关文章
- 【刷题-LeetCode】209. Minimum Size Subarray Sum
Minimum Size Subarray Sum Given an array of n positive integers and a positive integer s, find the m ...
- 【LeetCode】209. Minimum Size Subarray Sum 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/minimum- ...
- LeetCode OJ:Minimum Size Subarray Sum(最小子数组的和)
Given an array of n positive integers and a positive integer s, find the minimal length of a subarra ...
- 【Leetcode】209. Minimum Size Subarray Sum
Question: Given an array of n positive integers and a positive integer s, find the minimal length of ...
- leetcode面试准备:Minimum Size Subarray Sum
leetcode面试准备:Minimum Size Subarray Sum 1 题目 Given an array of n positive integers and a positive int ...
- [LeetCode] 209. Minimum Size Subarray Sum 最短子数组之和
Given an array of n positive integers and a positive integer s, find the minimal length of a contigu ...
- 209. Minimum Size Subarray Sum(双指针)
Given an array of n positive integers and a positive integer s, find the minimal length of a contigu ...
- LeetCode 209. Minimum Size Subarray Sum (最短子数组之和)
Given an array of n positive integers and a positive integer s, find the minimal length of a contigu ...
- LeetCode 209 Minimum Size Subarray Sum
Problem: Given an array of n positive integers and a positive integer s, find the minimal length of ...
随机推荐
- IMAX公司CEO:进军VR产业,打造VR体验中心
591ARVR资讯网www.591arvr.com报道近日,<财富>杂志采访了IMAX首席执行官理查德·葛尔方(Richar Gelfond),后者谈了谈虚拟现实和IMAX正在打造的VR影 ...
- Qt 打开指定的文件
最近项目用到使用本地的office打开指定的文件,记录一下代码: QString fileName = QFileDialog::getOpenFileName(this, tr("Open ...
- JS 一些常用技巧
记录 JS 常用的技巧 1. 生成随机数 2. 解决浮点数问题 3. 无路可走时,看看是不是 事件 冒泡了...
- asp.net时间范围查询
1.首先要查询类表中的一个时间段,要明确我的数据库中只有一个时间字段,我们先将他拆分一下. if ($("#news_OpenTime").val() != "" ...
- appnium框架以及源码研究
android4.0后,google提供了uiautomator来进行自动化方案,appium在高版本android上就是基于这个,4.0下是基于selendroid. appium相当于一个中转站, ...
- sqlmap基础使用
测试许多款 sql注入工具 最终还是发现 sqlmap 最为强悍 谁用谁知道!赶紧抛弃掉手上一大堆 sql 注入工具吧 : )测试环境:ubuntu 10.10 & windows 7(x64 ...
- cetos6 安装samba共享文件夹
yum方式安装 yum install samba 修改配置文件 vim /etc/samba/smb.conf [global] comment = global workgroup = QFpay ...
- C++类与static
到目前为止,我们设计的类中所有的成员变量和成员函数都是属于对象的,如我们在前面定义的book类,利用book类声明两个对象Alice和Harry,这两个对象均拥有各自的price和title成员变量, ...
- Webdriver其他定位方式
1.下拉框的定位 在遇到select下拉框的选择时,比如: <select id="nr" name="NR"> <option select ...
- 验证码计时 -- UIButton setTitle 闪烁问题解决方案
首先,有各种版本 方法一: 我运用的一种极其简单的版本: 将UIButton的Type 设成 Custom 就不会有闪烁的问题重现 p.p1 { margin: 0.0px 0.0px 0.0px ...