滑动窗口经典例题

简介: 滑动窗口经典例题

题目:


给你一个整数数组 nums 和一个整数 k 。
请你从 nums 中满足下述条件的全部子数组中找出最大子数组和:
子数组的长度是 k,且
子数组中的所有元素 各不相同 。
返回满足题面要求的最大子数组和。如果不存在子数组满足这些条件,返回 0 。
子数组 是数组中一段连续非空的元素序列。

示例:


输入:nums = [1,5,4,2,9,9,9], k = 3
输出:15
解释:nums 中长度为 3 的子数组是:
- [1,5,4] 满足全部条件,和为 10 。
- [5,4,2] 满足全部条件,和为 11 。
- [4,2,9] 满足全部条件,和为 15 。
- [2,9,9] 不满足全部条件,因为元素 9 出现重复。
- [9,9,9] 不满足全部条件,因为元素 9 出现重复。
因为 15 是满足全部条件的所有子数组中的最大子数组和,所以返回 15 。

解答:


class Solution {
    public long maximumSubarraySum(int[] nums, int k) {
        long count = 0;
        HashSet<Integer> map = new HashSet<>();
        int left = 0;
        int right = 0;
        long sum = 0;
        while(right<nums.length){
            while(map.contains(nums[right])||right-left>=k){
                sum-=nums[left];
                map.remove(nums[left]);
                left++;
            }
            sum+=nums[right];
            map.add(nums[right]);
            right++;
            if(right-left==k){
                count = Math.max(count,sum);
            }
        }
        return count;
    }
}

思路:


直接暴力接法会超时,所以采用滑动窗口来解答,主要有两点提效:
  1. 滑动窗口只需遍历一遍,减少循环次数
  2. 采用hash减少查找的时间
相关文章
|
7月前
|
算法
经典滑动窗口试题(二)
经典滑动窗口试题(二)
59 0
|
7月前
|
算法
经典滑动窗口试题(一)
经典滑动窗口试题(一)
69 0
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
|
7月前
|
算法
算法思想总结:滑动窗口算法
算法思想总结:滑动窗口算法
|
算法
第 6 天_滑动窗口【算法入门】
第 6 天_滑动窗口【算法入门】
77 0
|
算法
图解:快速排序之单边循环法
单边循环法是快速排序的算法之一,之前的双边循环法从数列的两边交替遍历元素,虽然更加直观,不过代码实现起来相对复杂。而单边循环法就要简单多了,只需要从数组的一边对元素进行遍历和交换即可。
206 0
图解:快速排序之单边循环法
|
机器学习/深度学习 算法 定位技术
BFS经典例题详解
BFS经典例题详解
150 0
|
SQL Rust Dart
经典例题(二)——超经典例题的归纳总结
经典例题(二)——超经典例题的归纳总结
150 0
经典例题(二)——超经典例题的归纳总结
|
算法 网络协议 索引
经典算法之——滑动窗口
经典算法之——滑动窗口
113 0
|
Web App开发 算法 测试技术
单调栈的经典例题
单调栈的经典例题
124 0