滑动窗口经典例题

简介: 滑动窗口经典例题

题目:


给你一个整数数组 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减少查找的时间
相关文章
|
3月前
|
算法
经典滑动窗口试题(一)
经典滑动窗口试题(一)
49 0
|
3月前
|
算法
经典滑动窗口试题(二)
经典滑动窗口试题(二)
47 0
|
10月前
|
存储 人工智能 算法
【算法分析与设计】动态规划(下)(一)
【算法分析与设计】动态规划(下)
|
3月前
|
存储 算法
数字三角形(很经典的动态规划问题)
数字三角形(很经典的动态规划问题)
|
10月前
|
算法 C++
【LeetCode 算法专题突破】滑动窗口(⭐)
【LeetCode 算法专题突破】滑动窗口(⭐)
32 0
|
算法
第 6 天_滑动窗口【算法入门】
第 6 天_滑动窗口【算法入门】
58 0
|
11月前
递归经典例题——汉诺塔
递归经典例题——汉诺塔
96 1
|
10月前
|
存储 算法
【算法分析与设计】动态规划(下)(三)
【算法分析与设计】动态规划(下)
|
10月前
|
消息中间件 人工智能 算法
【算法分析与设计】动态规划(下)(二)
【算法分析与设计】动态规划(下)
|
11月前
|
算法
贪心算法的思路和典型例题
贪心算法的思路和典型例题