Leetcode题库 - 长度最小的子数组(java语言版)

题目描述:

给定一个含有 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组如果不存在符合条件的连续子数组,返回 0。

示例: 

输入: s = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。

         这道题刚开始没有思路,就想双重for循环,尝试了一下没有成功,借鉴了一下题目思路:https://leetcode-cn.com/explore/orignial/card/all-about-array/233/sliding-window/

         这道题用‘滑动窗口’的方法,这个种方法也好理解,就是定义两个指针,一个确定右边的边界,一个确定左边的边界,然后将这两个边界之间的数相加,与输入分数比较,小于的话就将右边的这个边界指针向后移动,扩大窗口范围,如果大于s就将左边的边界向后移动缩小窗口范围,并且让sum减去左边对应的坐标。重复这个操作,最后选出(右边指针下标减去左边指针下标的值和刚开始定义的最终连续数组的长度,之间比较最小值,将小的那个赋值给最终输出的那个值)

          具体思路是:

          要求是连续子数组,所以我们必须定义 i,j两个指针,i 向前遍历,j 向后遍历,相当与一个滑块,这样所有的子数组都会在 [i...j] 中出现,如果 nums[i..j] 的和小于目标值 s,那么j向后移一位,再次比较,直到大于目标值 s 之后,i 向前移动一位,缩小数组的长度。遍历到i到数组的最末端,就算结束了,如果不存在符合条件的就返回 0。

          代码如下:

 public static void main(String[] args){
        int []a = new int[]{5,1,3,5,10,7,4,9,2,8};
        int s = 150;
        int j =-1;//滑动窗口,( //双指针实现滑动窗口,一块一慢)
        int sum=0;//记录子数组的和用来判断
        int result = a.length;//记录连续数组的长度
//        遍历数组
        for (int i = 0;i<a.length;){
//            j+1不大于数组长度时,sum<s时,让第一个指针(向右移动的快指针)++,并且将对应的值相加
              if (j+1<a.length&&sum<s){
                  j++;
                  sum = sum+a[j];
              }else {
//                  如果sum>=s时就将sum-去左边的指针对应的值,然后将左边指针++
                  sum= sum-a[i];
                  i++;
              }
//              如果sum大于s,将快指针与慢指针对应的差与result(定义整个数组的长度)比较,将小的那个值赋值给result
              if (sum>=s){
                  result = Math.min (j+1-i, result);
              }
        }
//        如果最后result和最初定义的长度相同证明数组里,不存在符合条件的连续数组,返回0.
        if (result==a.length){
            System.out.println(0);
        }
        System.out.println(result);

    }

 执行结果:

执行用时:

      总结:有学习了一种新的方法,滑动窗口法,定义两个指针,相当于一个滑块,来进行操作,很好的一个方法,时间复杂度也低。

2019-3-11

发布了43 篇原创文章 · 获赞 6 · 访问量 6670

猜你喜欢

转载自blog.csdn.net/weixin_37850160/article/details/88389460