(LeetCode 面试经典 150 题 ) 209. 长度最小的子数组(双指针)

题目:209. 长度最小的子数组


思路:双指针,时间复杂度0(n)。

sum记录左右指针内的数组元素之和,当sum-nums[left]>=target时,移动左指针。

C++版本:

cpp 复制代码
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n=nums.size();
        int mn=n+1;
        int sum=0;
        for(int left=0,right=0;right<n;right++){
            sum+=nums[right];
            while(sum-nums[left]>=target){
                sum-=nums[left];
                left++;
            }
            if(sum>=target){
                mn=min(mn,right-left+1);
            }
        }
        return mn==n+1 ? 0:mn;
    }
};

JAVA版本:

java 复制代码
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int n=nums.length;
        int mn=n+1;
        int sum=0;
        for(int left=0,right=0;right<n;right++){
            sum+=nums[right];
            while(sum-nums[left]>=target){
                sum-=nums[left];
                left++;
            }
            if(sum>=target){
                mn=Math.min(mn,right-left+1);
            }
        }
        return mn==n+1 ? 0:mn;
    }
}

GO版本:

go 复制代码
func minSubArrayLen(target int, nums []int) int {
    n:=len(nums)
    sum,mn:=0,n+1
    for left,right:=0,0;right<n;right++ {
        sum+=nums[right]
        for sum-nums[left]>=target {
            sum-=nums[left]
            left++
        }
        if sum>=target {
            mn=min(mn,right-left+1)
        }
    }
    if mn==n+1 {
        return 0
    }
    return mn
}
相关推荐
地平线开发者几秒前
征程 6E/M|多 camera 场景示例
算法·自动驾驶
前端小巷子4 分钟前
JS实现丝滑文字滚动
前端·javascript·面试
源代码•宸11 分钟前
Leetcode—721. 账户合并【中等】
c++·经验分享·算法·leetcode·并查集
緈福的街口13 分钟前
【leetcode】77.组合
算法·leetcode·职场和发展
melonbo18 分钟前
c++工程如何提供http服务接口
c++·http
NAGNIP24 分钟前
深入 vLLM:高性能大模型推理框架解析
算法
JuneXcy28 分钟前
字符串(2)
算法
程序喵大人29 分钟前
写C++十年,我现在怎么设计类和模块?(附真实项目结构)
开发语言·c++·类和模板
快去睡觉~1 小时前
力扣152:乘积最大子数组
算法·leetcode·职场和发展
一只韩非子1 小时前
Spring AI Alibaba 快速上手教程:10 分钟接入大模型
java·后端·ai编程