209. 长度最小的子数组
滑动窗口
思路
初始化滑动窗口的起始位置 left = 0、终止位置 right = 0。
外循环先确定滑动窗口的终止位置(增大滑动窗口),找到符合条件的子序列,
根据当前子序列元素和大小的情况,在内循环中移动滑动窗口的起始位置(缩小滑动窗口),找到长度更小的且符合条件的子序列。
class Solution {public int minSubArrayLen(int target, int[] nums) {int left = 0;int res = Integer.MAX_VALUE;int sum = 0;for (int right = 0; right < nums.length; right++) { // 外循环先确定滑动窗口的终止位置sum += nums[right];while (sum >= target) { // 内循环移动滑动窗口的起始位置res = Math.min(res, right - left + 1);sum -= nums[left];left++;}}return res == Integer.MAX_VALUE ? 0 : res;}
}
暴力
思路
双层循环枚举所有子序列。
class Solution {public int minSubArrayLen(int target, int[] nums) {int k = nums.length;int res = 100001; // 最小长度int sum = 0;for (int i = 0; i < k; i++) {sum += nums[i];}int sum2 = sum;for (int left = 0; left < k; left++) {int sum3 = sum2;for (int right = k - 1; right >= left; right--) {// System.out.print(left);// System.out.print("--");// System.out.print(right);// System.out.print("--");// System.out.print(sum2);if (sum3 >= target && res > (right - left + 1)) {res = right - left + 1;}if (sum3 < target) {break;}sum3 = sum3 - nums[right];// System.out.print("--");// System.out.print(sum3);// System.out.print("--");// System.out.println(res);}sum2 = sum2 - nums[left];}if (res == 100001) return 0;return res;}
}