[LeetCode] -- 209.Minimum Size Subarray Sum 解题报告

该博客详细分析了LeetCode 209题的解题思路,主要使用滑动窗口算法解决。问题要求在正整数数组中找到元素之和大于等于目标值的最短子数组,返回其长度。博客指出暴力解法的时间复杂度过高,不适合。通过滑动窗口的方法,可以高效地找到满足条件的子数组,当元素之和小于目标值时,窗口向右扩展,大于目标值时更新最小长度并左移窗口,实现剪枝,提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

问题:Minimum Size Subarray Sum

Given an array of n positive integers and a positive integer s, find the minimal length of a contiguous subarray of which the sum ≥ s. If there isn’t one, return 0 instead.

Example:

Input: s = 7, nums = [2,3,1,2,4,3]
Output: 2
Explanation: the subarray [4,3] has the minimal length under the problem constraint.

问题分析

该问题是给定一个正整数组和一个目标整数s,其目的是在数组中找到 元素之和 > s 的最短子数组,并返回它的长度。如果不存在 元素之和 > s ,则返回 0 。

  1. 暴力解法,直接两层循环找到所有的子数组,然后记录元素之和 > s 的最短数组。时间复杂度 O ( n 2 ) O(n^2) O(n2),样例会超时…
  2. 滑动窗口,需要找的是连续的子数组,而且当一个数组的和小于某一个值之后,则其子数组的和肯定小于该值,所以完成没必要对已经小于目标值的子数组再去缩减。

滑动窗口思想如下:

以数组[2, 3, 1, 2, 4, 3]s=7为例。

滑动窗口

滑动窗口[i, j]初始为[0, 0]即数组的第一个元素,滑动规则如下:

  • 若元素之和 < s,窗口右边向右延伸,直到找到元素之和 > s 的子数组;第一次窗口为[2,3,1,2],和大于7
  • 若元素之和 > s,更新最小长度,min=4,并窗口左边向左移动,直到元素之和 < s。

该方法是找到每次刚好大于目标值的子数组,对那些必定小于目标值的子数组进行了剪枝。


解题代码

public static int minSubArrayLen(int s, int[] nums){
    /**
    * 暴力解法会超时,可以换一种思路:
    * 使用双指针找大于 s 的区间,快指针用来求和,慢指针用来逼近找到最小的区间
    * */
    if (nums == null)
    	return 0;
    int i = 0;
    int j = 0;
    int minLength = Integer.MAX_VALUE;
    int sum = 0;
    while (j < nums.length){
    	sum += nums[j++];
    	while (sum >= s){
    		minLength = Math.min(j-i, minLength);
    		sum -= nums[i++];
    	}
    }
    return minLength == Integer.MAX_VALUE ? 0 : minLength;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值