首页 > 其他分享 >[刷题记录Day13]Leetcode

[刷题记录Day13]Leetcode

时间:2023-08-25 23:34:27浏览次数:54  
标签:deque pq nums int add Day13 new Leetcode 刷题

No.1

题目

滑动窗口最大值

思路

  • 编写单调队列类
  • 讲解

代码

class MonoQue {  
    Deque<Integer> deque = new LinkedList<>();  
  
    // 弹出元素时,比较当前要弹出的值是否等于队列出口的值,相等则弹出  
    // 同时判断队列此时是否为空  
    void poll(int val) {  
        if (!deque.isEmpty() && deque.peek() == val)  
            deque.poll();  
    }  
  
    // 添加元素时,如果要添加的元素大于入口处的元素,则将入口元素弹出  
    // 保证队列单调递减  
    void add(int val) {  
        while (!deque.isEmpty() && val > deque.getLast())  
            deque.removeLast();  
        deque.add(val);  
    }  
  
    // 队列出口元素始终为最大值  
    int peek() {  
        return deque.peek();  
    }  
}  
  
public int[] maxSlidingWindow(int[] nums, int k) {  
    MonoQue monoQue = new MonoQue();  
    int[] res = new int[nums.length - k + 1];  
  
    for (int i = 0; i < k; i++) {  
        monoQue.add(nums[i]);  
    }  
    int left = 0, right = k, index = 0;  
    // 初始化,取出最大值  
    res[index++] = monoQue.peek();  
    while (right < nums.length) {  
        monoQue.poll(nums[left++]);  
        monoQue.add(nums[right++]);  
        res[index++] = monoQue.peek();  
    }  
  
    return res;  
}

No.2

题目

前 K 个高频元素

思路

  • 优先队列,小顶堆
  • 队列poll的只剩下前K个高频元素

代码

public int[] topKFrequent(int[] nums, int k) {  
    int[] result = new int[k];  
    // (number, frequency)  
    Map<Integer, Integer> map = new HashMap<>();  
    // 统计频率  
    for (int item : nums)  
        map.put(item, map.getOrDefault(item, 0) + 1);  
  
    PriorityQueue<int[]> pq = new PriorityQueue<>((pair1, pair2) -> pair1[1] - pair2[1]);  
    for (Map.Entry<Integer, Integer> entry: map.entrySet()) {  
        if (pq.size() < k) {  
            pq.add(new int[]{entry.getKey(), entry.getValue()});  
        } else { // pq.size() >= k  
            // 只有当前频率大于小顶堆频率时才弹出,考虑以下例子:  
            // k=2, 频率数组=[3,2,1]  
            // 不能为了1,把3弹出  
            if (entry.getValue() > pq.peek()[1]) {  
                pq.poll();  
                pq.add(new int[]{entry.getKey(), entry.getValue()});  
            }  
        }  
    }  
  
    int index = 0;  
    while (pq.size() > 0)  
        result[index++] = pq.poll()[0];  
  
    return result;  
}

标签:deque,pq,nums,int,add,Day13,new,Leetcode,刷题
From: https://www.cnblogs.com/tomatoQt/p/17658183.html

相关文章

  • [刷题记录Day8]Leetcode
    No.1题目反转字符串思路双指针,从头尾向中间遍历代码publicvoidreverseString(char[]s){ chartemp; intleft=0,right=s.length-1; while(left<right){ temp=s[left]; s[left]=s[right]; s[right]=temp; left++; right--; }}No.2......
  • [刷题记录Day9]Leetcode
    建议跳过No.1题目找出字符串中第一个匹配项的下标思路KMP代码No.2题目重复的子字符串思路KMP代码......
  • [刷题记录Day6]Leetcode哈希表
    No.1题目有效的字母异位词思路每个字符频率都相同,于是把字母表映射到长度为26的数组上代码publicbooleanisAnagram(Strings,Stringt){intlenS=s.length(),lenT=t.length();if(lenT!=lenS)returnfalse;int[]alphabet=newint[26]......
  • [刷题记录Day7]Leetcode哈希表
    No.1题目四数相加II思路很妙的办法:有四个数组A、B、C、D,用hashMap记录【A、B中数字之和】+【这些和出现的次数】,再遍历C、D中数字组合,寻找【0-C、D中数字之和】在hashMap中出现的次数,并累加本质上,这是把4个数组简化成了2个数组代码publicintfourSumCount(int[]nums1,......
  • 我害怕你,刷题的人——献给即将开始的高中
    小考、中考,期中考、期末考,单元考、月考,你从各种考试中走来。选择题、填空题、解答题;作用力的问题、赛跑的问题、溶液的问题;你认不认得这个字,你会写吗;他活了多少岁,他做了几件好事、几件坏事;函数、三角形还有一个圆,达·芬奇画画都在用的那些原理;run还是running,加to还是......
  • VSCode使用JavaScript刷LeetCode配置教程(亲试可以!)
    账号秘密都对,但是缺登录不成功的问题诀窍可能是:在属性设置中把LeetCode版本改成cn。点击LeetCode配置,修改Endpoint配置项,改成leetcode-cn,再次尝试登陆即可。  大家可移步原博文:https://blog.csdn.net/qq_37263248/article/details/124304402......
  • leetcode1260
    这是一道模拟题刚开始准备纯模拟,而后在题解看到一维压缩,才发现其实是将矩阵按行展开后进行k次右移操作。转换成一维后,难点就在转换坐标:行号=idx/列数;列号=idx%列数; ......
  • leetcode236求最近公共祖先
    递归TreeNode*dfs(TreeNode*root,TreeNode*p,TreeNode*q){if(!root)returnroot;//当发现这个节点已经是叶节点时,要告诉上层if(root==p||root==q)returnroot;//当发现是p节点或者q时也要告诉上层TreeNode*left=dfs(root->left,p,q);//左子树是否有p或者q......
  • Leetcode1636——按照频率将数组升序排序
    给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。 请你返回排序后的数组。 示例1:输入:nums=[1,1,2,2,2,3]输出:[3,1,1,2,2,2]解释:'3'频率为1,'1'频率为2,'2'频率为3。示例2:输入:nu......
  • 【LeetCode动态规划#16】矩阵的最小路径和、三角形的最小路径和
    矩阵的最小路径和给定一个包含非负整数的*m*x*n*网格grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:一个机器人每次只能向下或者向右移动一步。示例1:输入:grid=[[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径1→3→1→1→1的总和最小。......