首页 > 其他分享 >Leetcode面试经典150题-239.滑动窗口最大值

Leetcode面试经典150题-239.滑动窗口最大值

时间:2024-09-03 22:23:45浏览次数:6  
标签:150 right 窗口 nums int 链表 239 Leetcode left

解法都在代码里,不懂就留言或者私信

官方定级hard难度,其实是medium,确实字节考过

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums.length == 1) {
            return new int[]{nums[0]};
        }
        /**我们要返回的是一个数组,这个窗口从遍历到第k个元素(下标k-1)的时候就形成了,所以最后返回结果的
        长度是n-(k-1)=n-k+1 */
        int[] ans = new int[nums.length - k + 1];
        /**看题意就知道肯定是滑动窗口了,题目标题就是滑动窗口的最大值,这还有啥说的
        我们先定义一个窗口,left表示窗口的左边界(包含),right表示窗口的右边界(不包含)
        窗口的有效范围是[left, right)的前闭后开区间,初始窗口是[0,0)
        表示窗口内没有值 */
        int left = 0;
        int right = 0;
        /**我们使用双向链表来表示这个窗口,我们这里只求最大值,所以定义一个链表即可
        这里链表里存的是下标 */
        LinkedList<Integer> maxWindow = new LinkedList<>(); 
        /**遍历数组统计,right每次都++,left只有窗口形成之后才++,所以如果有越界这回事,right肯定比left早越界
        所以无需判断left是否越界,这里写<=是为了收集最后一个窗口的最大值*/
        while(right <= nums.length) {
            /**下面就是要处理加入right之前窗口已经形成的情况了,如果加right之前窗口已经够k个了,那left位置应该淘汰 
            原来的窗口是[left, right),有效长度是right-left*/
            if(right - left == k) {
                /**既然窗口够了,那搜集一波最大值 */
                ans[left] = nums[maxWindow.peekFirst()];
                /**如果left位置是当前窗口最大值,那它出去了最大值就变了 */
                if(left == maxWindow.peekFirst()) {
                    /**把最大值去掉,以后的最大值还是pollFirst */
                    maxWindow.pollFirst();
                } 
                /**left向右移动,原来的left出窗口 */
                left ++;
            }
            /**如果right已经越界了,那就没有必要进行剩下的了 */
            if(right == nums.length) {
                break;
            }
            /**我们当前不管窗口形成还有没有形成,right位置都要入窗口(入链表或者说入队列) 
            因为链表中的元素是按照从first到last越来越小排列的,所以窗口不为空并且窗口中有小于等于(这里要注意的是等于也要淘汰,等于淘汰的理由是
            你在我前面肯定出窗口的时间早于我,即便都不出去,你可以作为最大值的情况我也可以,你早点出去我更是比你更适合当最大值)就淘汰
            */
            while(!maxWindow.isEmpty() && nums[maxWindow.peekLast()] <= nums[right]) {
                maxWindow.pollLast();
            }
            /**把小于等于last位置的都淘汰,last位置就可以入窗口了*/
            maxWindow.addLast(right);
            /**不管窗口够不够,right肯定要右移的 */
            right ++;
        }
        return ans;
    }
}

标签:150,right,窗口,nums,int,链表,239,Leetcode,left
From: https://blog.csdn.net/Chang_Yafei/article/details/141799090

相关文章

  • Leetcode面试经典150题-54.螺旋矩阵
      解法都在代码里,不懂就留言或者私信这个题可能和算法关联不大,coding技巧为上classSolution{publicList<Integer>spiralOrder(int[][]matrix){/**先定义结果集*/List<Integer>ans=newArrayList<>();/**当前位置从(0,0)开始*/......
  • 【前端面试】leetcode树javascript
    写一个树//定义二叉树节点functionTreeNode(val,left,right){this.val=(val===undefined?0:val)this.left=(left===undefined?null:left)this.right=(right===undefined?null:right)}//示例使用constroot=newTr......
  • 322. 零钱兑换(leetcode)
    https://leetcode.cn/problems/coin-change/description/代码上比较麻烦的dp题,由于求的是最少数量,因此求答案时需要初始化无穷大来计算classSolution{publicintcoinChange(int[]coins,intamount){//f[i][j]表示前i个数中选,体积等于amount的选择最少硬......
  • 377. 组合总和 Ⅳ(leetcode)
    https://leetcode.cn/problems/combination-sum-iv/description/此篇题解解释了为什么不能直接用二维完全背包的方式做不过还是建议把这个题当成一个爬楼梯来做classSolution{public:intcombinationSum4(vector<int>&nums,inttarget){//f[i]表示若干数中......
  • 518. 零钱兑换 II(leetcode)
    https://leetcode.cn/problems/coin-change-ii/description/可以直接考虑用完全背包的传统二维做法classSolution{publicintchange(intamount,int[]coins){//题意就是一个完全背包问题//f[i][j]表示前i个数中选,体积等于j的最大选法种数,答案就......
  • LeetCode_0028. 找出字符串第一个匹配项的下标,KMP算法的实现
    题目描述  给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不是haystack的一部分,则返回-1。示例1:输入:haystack="sadbutsad",needle="sad"输出:0解释:"sad"在下标0和6处匹......
  • 代码随想录算法训练营|Day01 LeetCode 704.二分查找,27.移除元素,977.有序数组的平方
    数组理论基础数组是存放在连续空间上的相同类型数据的集合数组的元素是不能删的,只能覆盖704.二分查找LeetCode:704.有序数组的平方classSolution{public:intsearch(vector<int>&nums,inttarget){intlength=nums.size();inti=0......
  • Java LeetCode练习
        LeetCodeExercise        807.保持城市天际线    题解:贪心        从左侧和右侧看,城市天际线等于矩阵grid的每一行的建筑物高度最大值;从顶部和底部看,城市天际线等于矩阵grid的每一列的建筑物高度最大值。只要不改变每一行和每一列......
  • 1049. 最后一块石头的重量 II(leetcode)
    https://leetcode.cn/problems/last-stone-weight-ii/description/思路较为巧妙的dp题,关键点在于如何将问题转化为01背包,有点贪心的思想主要是划分为两堆尽可能相等的石碓,然后判断能否凑出这个偏小的石碓(若干石头中选,能否选出这个价值)这里根据f[i]的定义可以有两种做法,1.f......
  • Leetcode——1.合并有序数组
    给你两个按非递减顺序排列的整数数组nums1_和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2_到nums1中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的初......