力扣题目
解题思路
java代码
力扣题目:
给定一个含有 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
解题思路:
算法原理:
使用滑动窗口的方法来查找满足条件的最小子数组长度。通过不断调整窗口的左右边界来计算和更新。
思路:
初始化左右指针都在起始位置,不断向右移动右指针扩大窗口并累加和,当和大于等于目标值时,开始向右移动左指针缩小窗口并减去相应值,同时更新最小长度,然后继续移动右指针重复这个过程。
代码分析:
minSubArrayLen
方法中,初始化相关变量。- 外层循环移动右指针,内层循环在和满足条件时移动左指针并更新最小长度。
- 最后返回最小长度,如果一直没有找到则返回 0。
时间复杂度:O(n),左右指针都最多遍历数组一遍。
空间复杂度:O(1),只使用了固定的额外空间。
java代码:
package org.example.mouth8;
public class Leetcode209 {
public static void main(String[] args) {
int[] nums = {2,3,1,2,4,3};
int target = 7;
System.out.println(minSubArrayLen(target, nums));
}
public static int minSubArrayLen(int target, int[] nums) {
int left = 0;
int right = 0;
int sum = 0;
int min = Integer.MAX_VALUE;
while (right < nums.length) {
sum += nums[right];
while (sum >= target) {
min = Math.min(min, right - left + 1);
sum -= nums[left];
left++;
}
right++;
}
return min == Integer.MAX_VALUE ? 0 : min;
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项