• 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     }
  • 相关阅读:
    选择器的用处
    全栈工程师基础知识与笔记
    9.13日笔记
    9.12笔记
    9.11Css
    学习笔记
    9.10HTLM
    redis和memcached的区别(总结)
    OO第四次博客作业
    OO第三次博客作业
  • 原文地址:https://www.cnblogs.com/TheLaughingMan/p/8299446.html
Copyright © 2020-2023  润新知