首页 > 其他分享 >【哈希表】LeetCode 895. 最大频率栈

【哈希表】LeetCode 895. 最大频率栈

时间:2023-04-27 18:56:09浏览次数:44  
标签:895 int LeetCode 频率 哈希 maxFreq freq freqToVal valToFreq

题目链接

895. 最大频率栈

思路

很容易想到使用 map:valToFreq 来记录每个值出现的频率,这是没问题的,但关键是如何通过频率寻找到应该返回的数。

这时候我想到再加一个 map:freqToVal 来记录每个频率中出现的数字,为了符合题目返回最接近栈顶的元素的要求,freqToVal 的键值对类型选择 <Integer, Deque<Integer>>,这样如果两个元素是同频率的,就会返回最接近栈顶的元素。

代码

class FreqStack {
    // 当前 FreqStack 中的最大频率值
    int maxFreq;
    // 记录 FreqStack 中每个元素出现的频率
    TreeMap<Integer, Integer> valToFreq;
    // 记录每个频率对应的元素值
    TreeMap<Integer, Deque<Integer>> freqToVal;

    public FreqStack() {
        this.maxFreq = 0;
        this.valToFreq = new TreeMap<>();
        this.freqToVal = new TreeMap<>();
    }

    public void push(int val) {
        valToFreq.put(val, valToFreq.getOrDefault(val, 0) + 1);

        int freq = valToFreq.get(val);
        maxFreq = Math.max(maxFreq, freq);
        // 第一次出现这个频率
        if(!freqToVal.containsKey(freq)){
            freqToVal.put(freq, new ArrayDeque<>());
        }

        freqToVal.get(freq).push(val);
    }

    public int pop() {
        Deque<Integer> stack = freqToVal.get(maxFreq);
        int result = stack.pop();
        valToFreq.put(result, valToFreq.getOrDefault(result, 0) - 1);

        // 如果当前频率没有元素了,就需要更新最大频率
        while(
                maxFreq > 0 &&
                (
                        !freqToVal.containsKey(maxFreq) ||
                        freqToVal.getOrDefault(maxFreq, new ArrayDeque<>()).isEmpty()
                )
        ){
            maxFreq--;
        }

        return result;
    }
}

标签:895,int,LeetCode,频率,哈希,maxFreq,freq,freqToVal,valToFreq
From: https://www.cnblogs.com/shixuanliu/p/17359947.html

相关文章

  • 代码随想录Day38-Leetcode509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯
    咳咳,因为找实习+摆导致时间被浪费大半;先从动态规划学起吧,之前的慢慢补。理论基础动态规划的解题步骤1.确定dp数组及对应下标的含义2.确定dp的状态转移方程(递推公式)3.确定dp数组如何初始化4.确定dp遍历顺序5.距离推导dp数组验证509.斐波那契数题目链接:https://le......
  • [leetcode]复制带随机指针的链表
    力扣链接思路一:遍历链表,将链表结点复制下来,控制随机指针,去找对应的第几个(相对位置)进行链接.思路二:以时间换空间,创建两个指针数组,分别存放两个链表中结点的地址,直接可以在指针数组中找到结点该方法比上面的方法更优,但是时间复杂度依旧很高,但是还是达不到O(N)思路三:1.拷......
  • leetcode-350-两个数组的交集 II 题解
    题目给定两个数组,编写一个函数来计算它们的交集。示例1:输入:nums1=[1,2,2,1],nums2=[2,2]输出:[2,2]示例2:输入:nums1=[4,9,5],nums2=[9,4,9,8,4]输出:[4,9]说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。我们可以不考虑输出结果......
  • 1351. 统计有序矩阵中的负数(leetcode)
    https://leetcode.cn/problems/count-negative-numbers-in-a-sorted-matrix/1351.统计有序矩阵中的负数1.二分法:把每一行进行一遍二分,找到正数与负数的边界,且此时grid[i][mid]也为负数,即边界下标的对应值是负数的左半边界那么一行中的个数即为size()-lclassSolution{pu......
  • #yyds干货盘点# LeetCode程序员面试金典:解数独
    题目:编写一个程序,通过填充空格来解决数独问题。数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)数独部分空格内已填入了数字,空白格用 '.' 表示。 示例1......
  • #yyds干货盘点# LeetCode面试题:合并两个有序数组
    1.简述:给你两个按非递减顺序排列的整数数组 nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1......
  • 【哈希表】LeetCode 767. 重构字符串
    题目链接767.重构字符串思路先用哈希表统计出出现次数最多的字符,如果这个次数大于一半,说明这个字符总会挨在一起,直接返回""。如果不超过一半,则先把字符填在偶数位置(先填出现次数最多的字符),偶数位置填满了再填奇数位置。代码classSolution{publicStringreorganize......
  • 【DP】LeetCode 740. 删除并获得点数
    题目链接740.删除并获得点数思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以前i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1前i个元素(......
  • LeetCode 152. 乘积最大子数组
    20230426顺利通过原题解题目约束题解classSolution{public:intmaxProduct(vector<int>&nums){intmaxF=nums[0],minF=nums[0],ans=nums[0];for(inti=1;i<nums.size();++i){intmx=maxF,mn=minF;......
  • 哈希表
    哈希表1.哈希表基本介绍散列表(HashTable,也叫哈希表),是根据关键码值(KeyValue)而直接进行访问的数据结构。也即是说,它通过把关键码值映射到表中的一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。哈希表的内存布局(数组+链表)2.......