给定一个由 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 }