滑动窗口经典例题

简介: 滑动窗口经典例题

题目:


给你一个整数数组 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减少查找的时间
相关文章
|
6月前
|
算法
经典滑动窗口试题(二)
经典滑动窗口试题(二)
54 0
|
6月前
|
算法
经典滑动窗口试题(一)
经典滑动窗口试题(一)
64 0
|
4月前
|
存储 算法
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
|
6月前
|
存储 算法
数字三角形(很经典的动态规划问题)
数字三角形(很经典的动态规划问题)
|
算法 C++
【LeetCode 算法专题突破】滑动窗口(⭐)
【LeetCode 算法专题突破】滑动窗口(⭐)
52 0
|
存储 算法
算法分类数组经典题目
算法分类数组经典题目
|
算法
贪心算法的思路和典型例题
贪心算法的思路和典型例题
|
算法 网络协议 索引
经典算法之——滑动窗口
经典算法之——滑动窗口
107 0
|
Web App开发 算法 测试技术
单调栈的经典例题
单调栈的经典例题
115 0
|
SQL Rust Dart
经典例题(二)——超经典例题的归纳总结
经典例题(二)——超经典例题的归纳总结
138 0
经典例题(二)——超经典例题的归纳总结