406. 和大于S的最小子数组

给定一个由 n 个正整数组成的数组和一个正整数 s ,请找出该数组中满足其和 ≥ s 的最小长度子数组。如果无解,则返回 -1。

样例

给定数组 [2,3,1,2,4,3] 和 s = 7, 子数组 [4,3] 是该条件下的最小长度子数组。

挑战 

如果你已经完成了O(n)时间复杂度的编程,请再试试 O(n log n)时间复杂度。

一开始看到可以O(nlogn)就想到了排序,然后速度撸了串代码出来

 1 int minimumSize(vector<int> nums, int s) {
 2         // write your code here
 3         if(nums.empty()){
 4             return -1;
 5         }
 6         sort(nums.begin(), nums.end(), greater<int>());
 7         int sum=nums[0],index=1;
 8         while(sum<s && index<nums.size()){
 9             sum+=nums[index++];
10         }
11         if(sum<s){
12             return -1;
13         }
14         else{
15             return index;
16         }
17     }

问题在于过不了这个case

[100,50,99,50,100,50,99,50,100,50]
250

期望答案是4,我一看这个数组不是有三个100吗?输出3难道不对吗?

最后看了一眼其他解法,没想到是意思是要求连续子数组,没了连续两个字让我困惑很久。

那么明确是连续子数组就简单了,两个指针就行

 1 int minimumSize(vector<int> nums, int s) {
 2         // write your code here
 3         if(nums.empty() || accumulate(nums.begin(),nums.end(),0)<s){
 4             return -1;
 5         }
 6         
 7         int sum=0,index=0,cnt=0,res=INT_MAX;
 8         for(int i=0;i<nums.size();i++){
 9             index=i;
10             sum=0;
11             cnt=0;
12             while(sum<s && index<nums.size()){
13                 sum+=nums[index++];
14                 cnt++;
15             }
16             if(sum>=s && cnt<res){
17                 res=cnt;
18             }
19         }
20         return res;
21     }
原文地址:https://www.cnblogs.com/TheLaughingMan/p/8299446.html