347. 前 K 个高频元素
题目描述
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
解题思路
#![allow(unused)] fn main() { struct Solution {} #[derive(PartialEq, Eq)] struct Y { a: i32, b: usize, } type Z = Y; use std::cmp::Ordering; impl PartialOrd<Z>for Z{fn partial_cmp(&self,o:&Z)->Option<Ordering>{Some(self.cmp(o))}} impl Ord for Z{fn cmp(&self,o:&Z)->Ordering{o.b.cmp(&self.b)}} impl Solution { pub fn top_k_frequent(v: Vec<i32>, k: i32) -> Vec<i32> { use std::collections::HashMap; use std::collections::BinaryHeap; let mut m: HashMap<i32, usize> = HashMap::new(); let mut q: BinaryHeap<Z> = BinaryHeap::new(); for i in v { *m.entry(i).or_default() += 1; } for (a, b) in m { q.push(Z {a:a, b:b}); if q.len() > k as usize { q.pop(); } } let mut res = vec![]; for i in q { res.push(i.a); } res } } }
学习感想
map+小顶堆
#![allow(unused)] fn main() { struct Solution {} impl Solution { pub fn top_k_frequent(nums: Vec<i32>, k: i32) -> Vec<i32> { use std::collections::{HashMap, BinaryHeap}; let mut map: HashMap<i32, usize> = HashMap::new(); nums.iter().for_each(|&i| { map.entry(i).and_modify(|x| *x += 1usize).or_default(); }); let mut res: Vec<i32> = Vec::new(); let mut pq: BinaryHeap<(usize, i32)> = BinaryHeap::new(); for (k, v) in map { pq.push((v, k)); } (0i32 .. k) .for_each(|_| { res.push(pq.pop().unwrap().1); }); res } } }