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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值