目录
什么是滑动窗口?
如何使用滑动窗口?
上经典题型:
相关力扣题:
类似于实际生活中的窗口:左边框+中间的部分+有边框。随着左边框和有边框不断的在数组上移动,中间的部分也跟随者移动,因此有了窗口在滑动的感觉,顾名滑动窗口。
确定三部分:
连接:
https://leetcode-cn.com/problems/minimum-size-subarray-sum/
题目:
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
用例1:
输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3]是该条件下的长度最小的子数组。
解法1: 双指针之滑动窗口
代码:
import java.util.*; class Solution { public int minSubArrayLen(int target, int[] nums) { //双指针之滑动窗口 思想:贪心算法。 int s=0; //窗口开始的位置 int result=Integer.MAX_VALUE;//定义一个整型变量中无限大的数; int sum=0;//滑动窗口内的值 int sumLength=0;// 记录滑动窗口的长度。 for(int e = 0 ; e < nums.length ;e++){ sum+=nums[e];//一直更新窗口内的值。 while(sum>=target){ //驱动窗口移动找寻最小的连续子数组长度 sumLength=(e-s+1);//计算窗口的 result = result < sumLength ? result : sumLength; //根之前的窗口比较找到最小的窗口。 sum -= nums[s++];//更新窗口开始的位置。 } } return result == Integer.MAX_VALUE? 0 : result; } }
解法2:暴力解法:
代码:
import java.util.*; class Solution { public int minSubArrayLen(int target, int[] nums) { //来个暴力一点的解法 。。。。。。两个for循环 // 第一个for循环从0开始负责遍历整个数组 //第二个for循环负责在第一个for循环此时位置的基础上找刚好大于目标值的位置, int result=Integer.MAX_VALUE; int sum=0; int subLength=0; for(int i = 0;i<nums.length;i++){ sum=0; for(int j=i;j<nums.length;j++){ sum+=nums[j]; if(sum>=target){ subLength=j-i+1; result = result<subLength?result:subLength; break; } } } return result == Integer.MAX_VALUE? 0 : result; } }