【双指针】209. 长度最小的子数组
题目:
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
输入:s = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
解答:
方法一:暴力
class Solution { public int minSubArrayLen(int s, int[] nums) { int n = nums.length; if (n == 0) { return 0; } int ans = Integer.MAX_VALUE; for (int i = 0; i < n; i++) { int sum = 0; for (int j = i; j < n; j++) { sum += nums[j]; if (sum >= s) { ans = Math.min(ans, j - i + 1); break; } } } return ans == Integer.MAX_VALUE ? 0 : ans; } }
方法二:双指针
class Solution { //双指针 //初始状态下,start 和 end 都指向下标 0,sum 的值为 0。 public int minSubArrayLen(int s, int[] nums) { int res = Integer.MAX_VALUE; int n = nums.length; if(n == 0){ return 0; } int start = 0,end = 0, sum = 0; while(end<n){ //每移动一次end,就加上nums[end]; sum +=nums[end]; //如果sum>=s,则start不断右移,sum减去nums[start],直到sum<s为止 while(sum>=s){ res = Math.min(res,end-start+1); sum = sum - nums[start]; start++; } end++; } return res == Integer.MAX_VALUE ? 0:res; } }

浙公网安备 33010602011771号