对于数组的操作,在算法实现中,可以考虑三种思想
- 阵地攻守 例题https://blog.csdn.net/fmuma/article/details/79858876
- 指针碰撞 例题https://blog.csdn.net/fmuma/article/details/79926339
- 滑动窗口 本题
题目
给定一个含有 n 个正整数的数组和一个正整数 s , 找到一个最小的连续子数组的长度,使得这个子数组的数字和 ≥ s 。如果不存在符合条件的子数组,返回 0。
举个例子,给定数组 [2,3,1,2,4,3] 和 s = 7,
子数组 [4,3]为符合问题要求的最小长度。
代码
package com.wy.LeetCode;
// 数组的滑动窗口
public class T209 {
public static void main(String[] args) {
int []nums = {2,3,1,2,4,3};
System.out.println(T209.minSubArrayLen(7,nums));
}
public static int minSubArrayLen(int s, int[] nums) {
int length = nums.length;
if(length==0)
return 0;
//构建滑动窗口,从数组索引0开始
int l = 0;
int r = -1; //一开始,设置滑动窗口不存在
int sum = 0;//滑动窗口元素的和
int result = length+1; //先让滑动窗口的大小为数组长度+1,很明显是不可能为这个数值的
while (l<length){
if( r+1<length && sum<s){ //在对于有数组的操作需要考虑到索引下标
r++;
sum += nums[r];
}else{
sum -= nums[l];
l++;
}
if(sum>=s){
result = Math.min(result,r-l+1);
}
}
if(result==length+1)
return 0;
return result;
}
}