zoukankan      html  css  js  c++  java
  • 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     }
  • 相关阅读:
    sql插入临时表数据的方法
    bootstrap中模态框、模态框的属性
    前台页面实现拖拽图片,拖拽图片排序
    生成二维码,二维码的生成
    bootstrap表格分页
    Python 处理Excel内的数据(案例介绍*2)
    微博数据抓取练习
    微信小程序开发笔记(二)
    微信小程序开发笔记(一)
    UCI 人口收入数据分析(python)
  • 原文地址:https://www.cnblogs.com/TheLaughingMan/p/8299446.html
Copyright © 2011-2022 走看看