LeetCode算法之长度最小的子数组[两种解法]
小知识
先对下面文章中使用到的一个工具进行解释,Math; Math是java提供的一个工具类,此工具类不需要创建对象,相当于一个函数的使用,直接在java中调用使用即可,文中Math.min(1,2);是对min()中的内容进行判断,判断哪一个数据最小,再将最小的数据返回给接收的变量.
一、暴力破解法
对于这种循环增量判断比较的问题,首先想到的就是暴力破解法,简单明了,使用for循环做两层循环,第一个固定值,第二个循环相加判断,直至找出我们想要的数据出来,并记录下来,再出来到第一层更换值,然后再去循环做这一件事,直至数据循环到底.
有不懂的小伙伴,注意代码中的文字注释
public class demoT {
public static void main(String[] args) {
int[] arr={6,1,2,3,4};
int min=Integer.MAX_VALUE;
int sum=0;
int target=7;
for (int i=0;i<arr.length-1;i++){
sum+=arr[i];
if (sum>=target){
break;
};
for (int j=i+1;j<arr.length;j++){
sum+=arr[j];
if (sum>=target){
min=Math.min(min,j-i+1);
sum=0;
break;
}
}
}
System.out.println(min==Integer.MAX_VALUE? 0:min);
}
}
但是暴力破解效率比较差,在小数据量面前可以,在百万数据量的时候,就可以看出明显的效率问题.
二、使用队列相加实现,可以看成滑动窗口
首先将数组中的数据相加,选出我们要查找的数据总和出来,然后将这组数据以队列形式,如果大于数据,记录给变量,我们就将这组数组头部数据踢出去,再去判断,如果还大于或等于,就再去踢头部数据,直至不满足条件,再将新的数据,也就是队尾下标加一的数据添加进来,再去循环上面的判断,如此直到最后一条数据.
有不懂的小伙伴,注意文字注释内容
public class demoOne {
public static void main(String[] args) {
int[] arr={2,1,3,5,4,5,1,1};
int tatget=7;
int sum=0;
int Lidx=0;
int Oidx=0;
int min=Integer.MAX_VALUE;
while (Lidx<arr.length){
sum+=arr[Lidx++];
while (sum>=tatget){
min=Math.min(min,Lidx-Oidx);
sum-=arr[Oidx++];
}
}
System.out.println(min==Integer.MAX_VALUE ? 0:min);
}
}
三.小结
本章使用java实现了对长度最小的子数组算法的实现,一共使用了两种算法,一种暴力破解,效率较慢,一种队列实现,思维较复杂,当然不止这两种解法,还有很多解法,各位感兴趣的小伙伴,自己动手实现吧. 有哪里不足或者有更好的建议,欢迎留言吐槽,有哪里不懂的小伙伴,可以私信我,我会一一答复,感谢认可,感谢支持!
|