2022-10-15:给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。 你可以按 任意顺序 返回答案。 要求时间复杂度O(N)。 输入: nums = [1,1,1

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-10-15:给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。 你可以按 任意顺序 返回答案。 要求时间复杂度O(N)。 输入: nums = [1,1,1相关的知识,希望对你有一定的参考价值。

2022-10-15:给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。
你可以按 任意顺序 返回答案。
要求时间复杂度O(N)。
输入: nums = [1,1,1,2,2,3], k = 2。
输出: [1,2]。

答案2022-10-15:

力扣347。词频统计,bfprt算法。
力扣上测试了主流语言的运行速度和内存占用。运行速度上,rust最快,go最慢,但跟java差不多。内存占用上,rust最少,go比rust稍微多一点,java最多。

代码用rust编写。代码如下:

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 

执行结果如下:



左神java代码

以上是关于2022-10-15:给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。 你可以按 任意顺序 返回答案。 要求时间复杂度O(N)。 输入: nums = [1,1,1的主要内容,如果未能解决你的问题,请参考以下文章

2021-11-05:摆动排序 II。给你一个整数数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序。你可以假设所有输入数组都可以

2021-11-04:计算右侧小于当前元素的个数。给你`一个整数数组 nums ,按要求返回一个新数组 counts 。数组 counts 有该性质: counts[i] 的值是 nums[i] 右(

2021-10-29:除自身以外数组的乘积。给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之

Leetcode练习(Python):数组类:第152题:给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字)。

2022-02-04:组合总和 Ⅳ。 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证

2021-11-12:前 K 个高频元素。给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。提示:1 <= nums.length <=