leecode209长度最小的子数组——手写详解
滑动窗口解决代码的思路和优化思路——手写版
思路
优化思路
代码分析
通过代码(未优化)
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;
}
}
本文作者:TranquilGlow
本文链接:https://www.cnblogs.com/xuehaiqiule/p/17621634.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步