use rand::Rng;use std::{collections::HashMap, iter::repeat};impl Solution {    pub fn top_k_frequent(nums: Vec<i32>, k: i32) -> Vec<i32> {        let mut map: HashMap<i32, i32> = HashMap::new();        for num in nums.iter() {            map.insert(                *num,                if map.contains_key(num) {                    *map.get(num).unwrap()                } else {                    0                } + 1,            );        }        let mut i = map.len() as i32;        let mut arr: Vec<Vec<i32>> = repeat(repeat(0).take(2).collect())            .take(i as usize)            .collect();        for (key, value) in map.iter() {            i -= 1;            arr[i as usize][0] = *key;            arr[i as usize][1] = *value;        }        let arr_len = arr.len() as i32;        Solution::more_less(&mut arr, 0, arr_len - 1, k);        let mut ans: Vec<i32> = repeat(0).take(k as usize).collect();        while i < k {            ans[i as usize] = arr[i as usize][0];            i += 1;        }        return ans;    }
    fn more_less(arr: &mut Vec<Vec<i32>>, l: i32, r: i32, k: i32) {        if k == r - l + 1 {            return;        }        arr.swap(            r as usize,            (l + rand::thread_rng().gen_range(0, r - l + 1)) as usize,        );        let pivot = Solution::partition(arr, l, r);        if pivot - l == k {            return;        } else if pivot - l > k {            Solution::more_less(arr, l, pivot - 1, k);        } else {            Solution::more_less(arr, pivot, r, k - pivot + l);        }    }
    fn partition(arr: &mut Vec<Vec<i32>>, l: i32, r: i32) -> i32 {        let mut left = l - 1;        let mut index = l;        while index < r {            if arr[index as usize][1] <= arr[r as usize][1] {                index += 1;            } else {                left += 1;                arr.swap(left as usize, index as usize);                index += 1;            }        }        left += 1;        arr.swap(left as usize, r as usize);        return left;    }}
fn main() {    let num2 = vec![1, 1, 1, 2, 2, 3];    let k = 2;    let ans = Solution::top_k_frequent(num2, k);    println!("ans = {:?}", ans);}
struct Solution {}
评论