滑动窗口解决代码的思路和优化思路——手写版
思路
优化思路
代码分析
通过代码(未优化)
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int fast=0,low =0;
int sum=nums[low],length=0;
//排除特殊情况
if(nums.length==1){
if(target>nums[0]){
return 0;
}else return 1;
}
if(nums[0]>target){
return 1;
}
for(fast =1 ;fast<nums.length;fast++){
if(sum+nums[fast]<target){
sum+=nums[fast];
}else {
sum+=nums[fast];
//找出这个length的最小值
if(low==0){
length=fast-low+1;
}else
length=Math.min(length,fast-low+1);
//对其进行求和
sum-=nums[low];
low++;
if(sum>=target){
length=Math.min(length,fast-low+1);
if(fast>low){
sum-=nums[low];
low++;
sum-=nums[fast];
fast--;
}
}
}
}
return length;
}
}
优化代码
针对上面的未优化代码我做了专项的优化,让这个代码变得更加简洁,更易懂
public class 长度最小的子数组 {
public static void main(String[] args) {
int n;
Scanner input = new Scanner(System.in);
System.out.println("请输入数组的长度");
n=input.nextInt();
int[] num = new int[n];
System.out.println("输入数组的元素只能为正数");
for (int i = 0; i < num.length; i++) {
num[i]= input.nextInt();
}
System.out.println("请输入你要查找的目标值");
int target = input.nextInt();
System.out.println(minSubArrayLen(target, num));
}
//优化代码
public static int minSubArrayLen(int target, int[] nums) {
int fast=0,low =0;
int sum=0,length=100002; //length要超过这个num.length的范围之后才能不断的进行更新
//排除特殊情况
for(fast =0 ;fast<nums.length;fast++){
sum+=nums[fast];
if(sum>=target){
//找出这个length的最小值
length = Math.min(length,fast-low+1);
//对其进行求和
sum-=nums[low];
low++; //低速指针前移,让其数组范围缩小
while (sum>=target){
length=Math.min(length,fast-low+1);
sum-=nums[low];
low++;
}
}
}
if(length==100002){
return 0;
}
return length;
}
}