首页 > 其他分享 >LeetCode —— 滑动窗口

LeetCode —— 滑动窗口

时间:2023-06-26 23:56:51浏览次数:48  
标签:Map right 窗口 curWinKind2CntMap fruits 滑动 LeetCode left

904. 水果成篮

用一个 Map 记录当前窗口的情况:  key - 水果种类数 value - 这个水果种类在当前滑动窗口里出现的次数

维持一个 left 指针到 right 指针的滑动窗口

每次 right 右移一位,将新加入窗口的  fruits[right] 这个种类放到 map 里,并将该种类计数 +1

如果当前窗口水果种类数,即 map 的 size 大于规定的 2

那么需要左指针右移,维持窗口内种类的数量不大于 2

思考下 [1,0,1,4,]1,4,1,2,3 这种情况
在 [1,0,1,4,] 这个窗口,凭人的判断应该将左指针移到 1 这里,窗口变成 [1,4]
但是怎么用代码来实现这个逻辑呢?
我刚开始只用了 Set ,没有用 Map。想窗口最左边的元素是 1,那 left 移动到第一个不等于 1 的地方就行了,显然这种情况不适用

后来又想从窗口最右边往左找第一个不等于 1 的地方,对于这种情况也是不适用的

后面看了题解,正确的做法应该是

left 每右移一格,map 里这个种类窗口计数 -1

并且每次 -1 后判断,当前 left 的种类窗口计数是否减到了0

减到0,说明窗口没有这个数字了,remove 掉

对于上面的例子,窗口 [1,0,1,4]

leftIndex = 0  Map {1:2, 0:1, 4:1}

leftIndex = 1  Map {1:1, 0:1, 4:1}

leftIndex = 2  Map {1:1, 0:0, 4:1} -->  Map {1:1, 4:1}

窗口里只剩两个种类了,可以退出循环了,最后窗口为 [1,4,]

class Solution {
    public int totalFruit(int[] fruits) {
        int left=0;
        int right=0;
        int maxRes = Integer.MIN_VALUE;
        Map<Integer, Integer> curWinKind2CntMap = new HashMap();
        while (right < fruits.length) {
            // 放入窗口右边的水果,并将计数 + 1
            // 注意 getOrDefault
            curWinKind2CntMap.put(fruits[right], curWinKind2CntMap.getOrDefault(fruits[right], 0) + 1);
            // 当窗口内种类数 > 2
            if (curWinKind2CntMap.size() > 2) {
                // left 左移,fruits[left] 种类数 -1
                curWinKind2CntMap.put(fruits[left], curWinKind2CntMap.get(fruits[left]) - 1);
                // 如果减到0,说明没有了,移除掉
                if (curWinKind2CntMap.get(fruits[left]) == 0) {
                    curWinKind2CntMap.remove(fruits[left]);
                }
                left++;
            }
            // 窗口大小
            int winLen = right - left + 1;
            // 与最大值比较
            if (winLen > maxRes) {
                maxRes = winLen;
            }
            right++;
        }
        return maxRes;
    }
}

 

标签:Map,right,窗口,curWinKind2CntMap,fruits,滑动,LeetCode,left
From: https://www.cnblogs.com/suBlog/p/17507496.html

相关文章

  • [LeetCode] 2485. Find the Pivot Integer
    Givenapositiveinteger n,findthe pivotinteger x suchthat:Thesumofallelementsbetween 1 and x inclusivelyequalsthesumofallelementsbetween x and n inclusively.Return thepivotinteger x.Ifnosuchintegerexists,return -1.......
  • LeetCode 128. 最长连续序列
    为什么这题我都不会,脑袋有点累,状态真差classSolution{public:intlongestConsecutive(vector<int>&nums){unordered_set<int>s(nums.begin(),nums.end());//记录数字是否出现过intres=0;for(autoi:nums)//枚举每个数字,查看以当前数字......
  • html去除页面的滑动条
    https://blog.csdn.net/WzhCsdnd/article/details/1294658271、在<body>里直接加入,可隐藏滚动条;例如:<bodyscroll="no">,隐藏滚动条;<bodyscroll="auto">宽度或高度大于页面的宽或高时,不显示滚动条,反之,则显示;<bodystyle="overflow-x:hidden">可隐藏水平滚动条;&l......
  • leetcode-前缀和数组&差分数组
    前缀和数组:前缀和技巧适用于快速、频繁地计算一个索引区间内的元素之和。(仅仅适用于原数组不变的情况,如果原数组经常修改,则需要考虑差分数组。)模版如下:classPrefixSum{//前缀和数组privateint[]preSum;/*输入一个数组,构造前缀和*/publicPrefixSu......
  • win32k.sys 是 Windows 操作系统中的一个系统文件,它是负责管理图形操作、窗口绘制和用
    win32k.sys是Windows操作系统中的一个系统文件,它是负责管理图形操作、窗口绘制和用户界面的部分。这个文件位于C:\Windows\System32\drivers\文件夹中。win32k.sys文件是一个核心的系统文件,它在系统启动时加载到内存中,并为应用程序提供图形和窗口管理的支持。它通过与硬件......
  • 2023-06-25 uview组件Vtabs 垂直选项卡无法滑动位移
    前言:uni项目中导入uview的vtabs插件来做分页,奈何导入demo后发现无法实现滑动页面来自动选中左侧菜单。原因:大哥!请先看文档,文档里有写,设置chain为true即可左右联动!好吧,是我没留意。解决方案:设置vtabs属性chain为true,官网示例代码:<template><viewclass="content">......
  • Win32k 是 Windows 操作系统中的一个核心组件,它负责处理图形显示、窗口管理和用户交互
    Win32k是Windows操作系统中的一个核心组件,它负责处理图形显示、窗口管理和用户交互等功能。在Windows中,Win32k.sys是一个内核模式驱动程序,它提供了访问图形子系统的接口。因此,Win32k具有较高的权限和特权。作为一个内核模式驱动程序,Win32k有比普通用户程序更高的权限级别......
  • 二叉树-快排-leetcode912
    给你一个整数数组nums,请你将该数组升序排列。示例1:输入:nums=[5,2,3,1]输出:[1,2,3,5]示例2:输入:nums=[5,1,1,2,0,0]输出:[0,0,1,1,2,5]提示:1<=nums.length<=5*104-5*104<=nums[i]<=5*104思路:快排,或者叫前序二叉树,排序后端结果是一个二叉搜索树//lee......
  • leetcode 48 旋转图像 rotate-image【ct】
    ====思路:1.对角线翻折  i=0;i<matrix.lengthj=i;j<matrix.lengthmatrix[i][j]matrix[j][i]=matrix[j][i]matrix[i][j]2.左右翻折i=0i<matrix.lengthj=0j<Math.floor(matrix.length/2)matrix[i][j]matrix[i][matrix.lengt......
  • 【LeetCode摩尔投票】有趣的简单题:数组中出现次数超过一半的数字
    数组中出现次数超过一半的数字https://leetcode.cn/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例1:输入:[1,2,3,......