法一(滑动窗口)
/**
* 法一(滑动窗口)
* (1)滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果
* (2)时间复杂度:O(2*n),即O(n)
* (3)空间复杂度:O(1)
*
* @param target
* @param nums
* @return
*/
public int minSubArrayLen(int target, int[] nums) {
int left = 0, sum = 0, ans = Integer.MAX_VALUE;
for (int right = 0; right < nums.length; right++) {
sum += nums[right]; // 当前滑动窗口内数值之和(滑动窗口右侧向右扩展)
while (sum >= target) {
ans = Math.min(ans, right - left + 1); // 找到符合条件的最短滑动窗口长度
sum -= nums[left++]; // 当前滑动窗口内数值之和(滑动窗口左侧向右收缩)
}
}
return ans == Integer.MAX_VALUE ? 0 : ans; // 如果ans没有被赋值,就返回0,说明没有符合条件的滑动窗口
}
本地测试
/**
* 209. 长度最小的子数组
*/
lay.showTitle(209);
Solution209 sol209 = new Solution209();
int target209 = 7;
int[] nums209 = new int[]{2, 3, 1, 2, 4, 3};
System.out.println(target209 + " " + Arrays.toString(nums209));
System.out.println(sol209.minSubArrayLen(target209, nums209));
版权声明:本文为qq_41829337原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。