LeetCode209

双指针滑动窗口
while不断去除sum中的数,直到不满足>target的条件
This commit is contained in:
whai 2023-12-10 21:09:11 +08:00
parent 961aa4cea9
commit 5926432b0a

View File

@ -0,0 +1,90 @@
package cn.whaifree.leetCode.middle;
import org.junit.Test;
/**
* 209. 长度最小的子数组
* 给定一个含有 n 个正整数的数组和一个正整数 target
*
* 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] 并返回其长度如果不存在符合条件的子数组返回 0
*
* 示例 1
*
* 输入target = 7, nums = [2,3,1,2,4,3]
* 输出2
* 解释子数组 [4,3] 是该条件下的长度最小的子数组
* 示例 2
*
* 输入target = 4, nums = [1,4,4]
* 输出1
* 示例 3
*
* 输入target = 11, nums = [1,1,1,1,1,1,1,1]
* 输出0
*
* 提示
*
* 1 <= target <= 109
* 1 <= nums.length <= 105
* 1 <= nums[i] <= 105
*
* 进阶
*
* 如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法
*/
public class LeetCode209 {
/**
* 暴力求解会超时
* @param target
* @param nums
* @return
*/
public int minSubArrayLen(int target, int[] nums) {
int minLength = Integer.MAX_VALUE;
for (int i = 0; i < nums.length; i++) {
int sum = 0;
for (int j = i; j < nums.length; j++) {
sum += nums[j];
if (sum >= target) {
minLength = Math.min(minLength, j - i + 1);
break;
}
/**
* if (sum >= target && j - i +1 < minLength) {
* minLength = j - i + 1;
* break;
* }
*/
}
}
return minLength == Integer.MAX_VALUE ? 0 : minLength;
}
public int minSubArrayLen1(int target, int[] nums) {
int left = 0;
int right = 0;
int sum = 0;
int ans = Integer.MAX_VALUE;
while (right < nums.length ) {
sum += nums[right];
// 窗口内找到最小子串
while (sum >= target) {
ans = Math.min(ans, right - left + 1);
sum -= nums[left++];
}
right++;
}
return ans == Integer.MAX_VALUE ? 0 : ans;
}
@Test
public void list() {
System.out.println(minSubArrayLen1(5, new int[]{2,3,6}));
}
}