[练习] 滑动窗口算法

原创
2022/04/04 01:41
阅读数 59

窗口算法可以用以解决数/字符串的子元素问题,它可以将嵌套的循环问题转换为单环问题,降低时间度, 算法包涵一个可以移动的左右指针.

1) 长度为k的连续子数组最大的和

    /**
     * 长度为k的连续子数组的最大和 //滑动窗口法
     * @param arr
     * @param k
     * @return
     */
    public static int maxSumSub(int[] arr,int k){
        if(arr.length<k){
            return -1;
        }
        int sum =0;
        //第一个窗口的和
        for(int i=0;i<k;i++){
            sum+=arr[i];
        }
        int maxSum =sum ;
        int left =1;
        int right =left+k-1;
        while(right<arr.length){
             sum = sum-arr[left-1]+arr[right];
             maxSum = Math.max(maxSum, sum);
             left++;
             right++;
        }
        return maxSum;
    } 

2) 最长的无重复子串

    /**
     * 无重复的最长子串,滑动窗口法, 比如abcada,返回4
     * @param s
     * @return
     */
    public static int getMaxNoRepeatSubStrLen(String s){
        if(s==null||s.length()==0){
            return 0;
        }
        HashMap<Character,Integer> map = new HashMap<>();
        int maxLen = 0;
        int left =0;
        int right =0;
        while(right<s.length()){
            if(!map.containsKey(s.charAt(right))){
                maxLen = Math.max(maxLen, right-left+1);    
            }else{
                //移动left
                left = map.get(s.charAt(right))+1;
            }
            map.put(s.charAt(right), right);
            //始终移动right
            right++;
        }
        return maxLen;
    }

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部