列表

详情


NC343. 和大于等于K的最短子数组

描述

给定一个长度为 n 的整数数组,和一个目标值 k ,请你找出这个整数数组中和大于等于 k 的最短子数组的长度。如果不存在和大于等于 k 的子数组则输出 -1。

数据范围:数组长度满足 , 数组中的值满足 1\le num_i \le 10^5 \

示例1

输入:

[2,1,2,3],5

输出:

2

示例2

输入:

[2,3,4,5],16

输出:

-1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 18ms, 内存消耗: 3272KB, 提交时间: 2022-06-14

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int shortestSubarray(vector<int>& nums, int k) {
        int left =0;
        int right =0;
        int sum = 0;
        int res =nums.size();
        while(right!=nums.size()){
            sum+=nums[right++];
            while(sum>=k){
                sum-=nums[left++];
                res = min(right-left+1,res);
            }
        }
        if(left!=0){
            return res;
        }else{
            return -1;
        }
    }
};

C++ 解法, 执行用时: 20ms, 内存消耗: 3268KB, 提交时间: 2022-08-05

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int shortestSubarray(vector<int>& nums, int k) {
        // write code here
        int L=0;
        int R=0;
        int N=nums.size();
        int sum=0;
        int minLen=INT_MAX;
        while(R<N)
        {
            sum+=nums[R];
            while(L<=R&&sum>=k){
              minLen=min(minLen,R-L+1);
              sum-=nums[L];
              L++;
            }
            R++;
        }
        return minLen==INT_MAX?-1:minLen;
    }
};

C++ 解法, 执行用时: 20ms, 内存消耗: 3268KB, 提交时间: 2022-07-09

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int shortestSubarray(vector<int>& nums, int k) {
        // write code here
        int length=(int)nums.size();
        int res=numeric_limits<int>::max();
        int left=0, right=0, sum=nums[0]; 
        while(right<length){
            if(sum>=k){
                res=res<=right-left+1?res:right-left+1;
                sum-=nums[left++];
            }else if(sum<k){
                right++;
                if(right>=length) break;
                sum+=nums[right];
            }
        }
        return res!=INT32_MAX?res:-1;
    }
};

C++ 解法, 执行用时: 21ms, 内存消耗: 3208KB, 提交时间: 2022-06-23

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int shortestSubarray(vector<int>& nums, int k) {
        // write code here
      int n = nums.size();
      int j = 0;
      int sumSubarray = 0;
      
      int min_len = INT_MAX;
      for(int i =0;i<nums.size(); ++i){
//         不满足条件
        while(j<n && sumSubarray < k){
          sumSubarray += nums[j];
          ++j;
        }
        if(sumSubarray >= k) min_len = min(min_len,j-i);
        sumSubarray -= nums[i];
        
      }
      
      if(min_len == INT_MAX)  return -1;
      
      return min_len;

    }
    
};

C++ 解法, 执行用时: 22ms, 内存消耗: 3256KB, 提交时间: 2022-06-08

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int shortestSubarray(vector<int>& nums, int k) {
        int sum = 0, n = nums.size(), ans = INT_MAX;
        for (int i = 0, j = 0; i < n; ++i) {
            sum += nums[i];
            if (sum <= 0) {
                j = i + 1;
                sum = 0;
            }
            while (sum >= k) {
                sum -= nums[j++];
            }
            if (j >= 1 && sum + nums[j - 1] >= k)
                ans = min(ans, i - j + 2);
        }
        return ans == INT_MAX ? -1 : ans;
    }
};

上一题