您的位置:首页 > 其它

209. Minimum Size Subarray Sum

2017-09-05 00:04 302 查看
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.

给定一组数和一个值,找到最短的子串,使得子串的和大于等于给定值。

我的思路:

模拟双指针的操作:

class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int n=nums.size();
if(n==0) return 0;
int i=0;
int j=0;
int sum=0;
int d=numeric_limits<int>::max();
while(j<n)
{
while(sum<s&&j<n)
sum+=nums[j++];
if(j==n&&sum<s) return d==numeric_limits<int>::max()?0:d;
j--;
d=min(d,j-i+1);//j指向当前最后一个元素,i指向第一个元素
if(d==1) break;
sum-=nums[i++];
if(j==n-1)//j已经到末尾了
{
while(sum-nums[i]>=s)
{
sum-=nums[i++];
d=min(d,j-i+1);
}
break;
}
if(j<n-1)
{
j++;
sum-=nums[i++];
while(sum-nums[i]+nums[j]>=s)
{
sum-=nums[i++];
d=min(d,j-i+1);
}
}

}
return d<=n?d:0;
}
};


使用双指针较为简洁的方法:

class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int n=nums.size();
if(n==0) return 0;
int left=0;
int sum=0;
int d=numeric_limits<int>::max();
for(int i=0;i<n;i++)
{
sum+=nums[i];
while(sum>=s)
{
d=min(d,i+1-left);
sum-=nums[left++];
}
}
return d==numeric_limits<int>::max()?0:d;
}
};


另外一种二分法,虽然复杂度是nlogn的但是,也值得掌握

明天看吧:

int minSubArrayLen(int s, vector<int>& nums)
{
int n = nums.size();
if (n == 0)
return 0;
int ans = INT_MAX;
vector<int> sums(n + 1, 0); //size = n+1 for easier calculations
//sums[0]=0 : Meaning that it is the sum of first 0 elements
//sums[1]=A[0] : Sum of first 1 elements
//ans so on...
for (int i = 1; i <= n; i++)
sums[i] = sums[i - 1] + nums[i - 1];
for (int i = 1; i <= n; i++) {
int to_find = s + sums[i - 1];
auto bound = lower_bound(sums.begin(), sums.end(), to_find);
if (bound != sums.end()) {
ans = min(ans, static_cast<int>(bound - (sums.begin() + i - 1)));
}
}
return (ans != INT_MAX) ? ans : 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: