列表

详情


NC202. 长度最小的连续子数组

描述

给定一个数组 nums 和一个正整数 target , 找出满足和大于等于 target 的长度最短的连续子数组并返回其长度,如果不存在这种子数组则返回 0。

数据范围:数组长度满足 ,数组中的元素满足

示例1

输入:

[1,2,4,4,1,1,1],9

输出:

3

示例2

输入:

[1,4,4,4,1,1,1],3

输出:

1

原站题解

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

C++ 解法, 执行用时: 7ms, 内存消耗: 1324KB, 提交时间: 2022-02-09

class Solution {
public:
    /*
    方法一:双指针
    
    思路
    双指针控制窗口端点,当窗口内元素的和小于目标时就扩张右边界,否则收缩左边界并更新长度。
    
    */
    int minSubarray(vector<int>& nums, int target) {
        int left = 0, right = 0, sum = 0, minLen = nums.size();
        while(right < nums.size()){
            sum += nums[right++];
            while(left < right && sum >= target){
                minLen = min(minLen, right - left);
                sum -= nums[left++];
            }
        }
        return minLen;
    }
};

C++ 解法, 执行用时: 8ms, 内存消耗: 1304KB, 提交时间: 2022-01-07

#include <cassert>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int minSubarray(vector<int>& nums, int target) {
        // write code here
        assert( !nums.empty() );
        assert(target > 0);
        for(int val : nums){
            assert(val > 0);
            assert(val <= 100000);
        }
        int len = nums.size();
        assert(len <= 100000);
        int i = 0, j = 0, min_len = 0x7FFFFFFF;   long long sum = 0;
        do{
            while(i < len)
            {
                sum += nums[ i++ ];
                if(sum >= target){
                    if(i-j < min_len) min_len = i-j;
                    break;
                }
            }
            while(j < i)
            {
                sum -= nums[ j++ ];
                if(sum > target) ;
                else if(sum < target) break;
                else if(i-j < min_len) min_len = i-j;
            }
        }while(i < len);
        return min_len!=0x7FFFFFFF ? min_len : 0;
    }
};

C++ 解法, 执行用时: 8ms, 内存消耗: 1316KB, 提交时间: 2021-11-18

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

C++ 解法, 执行用时: 8ms, 内存消耗: 1320KB, 提交时间: 2022-02-05

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

C++ 解法, 执行用时: 8ms, 内存消耗: 1324KB, 提交时间: 2022-01-28

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int minSubarray(vector<int>& nums, int target) {
        // write code here
        for(int i=1;i<nums.size();i++)
            nums[i]+=nums[i-1];
        if(nums[nums.size()-1]<target) return 0;
        nums.insert(nums.begin(), 0);
        int minLen=INT_MAX;
        int l=0,r=0;
        while(r<nums.size()){
            if(nums[r]-nums[l]<target)
                r++;
            else{
                while(nums[r]-nums[l]>=target){
                    l++;
                }
                minLen=min(minLen,r-l+1);
            }
        }
        return minLen;
    }
};

上一题