首页 > 其他分享 >每日一题:Leetcode-347 前K个高频元素

每日一题:Leetcode-347 前K个高频元素

时间:2024-09-20 14:19:33浏览次数:8  
标签:map int 复杂度 元素 list 347 数组 高频 Leetcode

力扣题目

解题思路

java代码

力扣题目:

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

示例 2:

输入: nums = [1], k = 1
输出: [1]

提示:

  • 1 <= nums.length <= 105
  • k 的取值范围是 [1, 数组中不相同的元素的个数]
  • 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的

进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。

解题思路:

算法原理
这道题使用哈希表和桶排序的思想来找出给定数组中出现频率最高的 k 个元素。

思路

  1. 首先,使用哈希表 map 统计数组中每个元素出现的次数。
  2. 然后创建一个桶数组 list ,桶的下标表示元素出现的次数,桶中存储出现次数相同的元素。
  3. 最后,从桶数组的末尾开始向前遍历,将元素添加到结果列表 res 中,直到 res 的大小达到 k 。

代码分析

  • 先通过一个循环统计每个数字的出现次数,存入哈希表。
  • 接着创建桶数组,并根据哈希表中的次数将数字放入对应的桶中。
  • 最后通过倒序遍历桶数组,将符合条件的数字添加到结果列表中。

时间复杂度

  • 统计元素出现次数的时间复杂度为  ,其中 n 是数组 nums 的长度。
  • 构建桶数组和填充桶的时间复杂度也为  。
  • 最后的遍历桶数组的时间复杂度为  。
    综合起来,总的时间复杂度为  。

空间复杂度

  • 哈希表的空间复杂度为  。
  • 桶数组的空间复杂度为  
  • 结果列表的空间复杂度为  。
    综合起来,总的空间复杂度为  。

java代码:

package org.example;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class Leetcode347 {
    public static void main(String[] args) {
        Leetcode347 leetcode347 = new Leetcode347();
        Object[] ans = leetcode347.topKFrequent(new int[]{1,1,1,2,2,3}, 2).toArray();
        for (Object i : ans) {
            System.out.println(i);
        }
    }
    public List<Integer> topKFrequent(int[] nums, int k) {
        List<Integer> res = new ArrayList();
        // 使用字典,统计每个元素出现的次数,元素为键,元素出现的次数为值
        HashMap<Integer,Integer> map = new HashMap();
        for(int num : nums){
            if (map.containsKey(num)) {
                map.put(num, map.get(num) + 1);
            } else {
                map.put(num, 1);
            }
        }

        //桶排序
        //将频率作为数组下标,对于出现频率不同的数字集合,存入对应的数组下标
        List<Integer>[] list = new List[nums.length+1];
        for(int key : map.keySet()){
            // 获取出现的次数作为下标
            int i = map.get(key);
            if(list[i] == null){
                list[i] = new ArrayList();
            }
            list[i].add(key);
        }

        // 倒序遍历数组获取出现顺序从大到小的排列
        for(int i = list.length - 1;i >= 0 && res.size() < k;i--){
            if(list[i] == null) continue;
            res.addAll(list[i]);
        }
        return res;
    }

}

更多详细内容同步到公众号,感谢大家的支持!

每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项

标签:map,int,复杂度,元素,list,347,数组,高频,Leetcode
From: https://blog.csdn.net/LIUCHANGSHUO/article/details/142376976

相关文章

  • 代码随想录算法训练营第十六天 | Javascript | 力扣Leetcode | 回溯 | 77. 组合、216.
    目录前言简介题目链接:77.组合题目链接:216.组合总和3题目链接:17.电话号码的字母组合前言踏平坎坷成大道,斗罢艰险又出发!自律的尽头是自控,自控的尽头是硬控。愿道友们披荆斩棘,终能得偿所愿。简介本人是小几年经验的前端开发,算法基础只有力扣几十道题,非常薄......
  • 代码随想录算法训练营第十五天 | Javascript | 继续二叉树的一天 | 力扣Leetcode | 补
    目录前言简介题目链接:501.二叉搜索树中的众数题目链接:236.二叉树的最近公共祖先题目链接:235.二叉搜索树的最近公共祖先前言踏平坎坷成大道,斗罢艰险又出发!自律的尽头是自控,自控的尽头是硬控。愿道友们披荆斩棘,终能得偿所愿。简介本人是小几年经验的前端开发,......
  • PCB高频电路布线,你可以这么做!
    随着电子设备功能的日益复杂化,电路的集成度越来越高,这就要求我们在设计电路板时采用多层板,以满足布线需求并有效降低电磁干扰。本文将介绍一些高频电路布线时的关键考虑因素,帮助我们更好地理解这一领域的技术要点。首先,高频电路的设计需要特别注意信号的传输特性。在多层PC......
  • leetcode-2414|菜鸟提升日记20240919
    数模打完后一直萎靡不振。。。今天小菜鸟终于支棱起来了!继续加油(ง•_•)ง题目:字母序连续字符串 是由字母表中连续字母组成的字符串。换句话说,字符串 "abcdefghijklmnopqrstuvwxyz" 的任意子字符串都是 字母序连续字符串 。例如,"abc" 是一个字母序连续字符串,而 "......
  • 代码随想录刷题day13 | LeetCode 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之
    110.平衡二叉树力扣题目链接后序遍历求高度,高度判断是否平衡|LeetCode:110.平衡二叉树1.三元运算符:(?:)condition?expression_if_true:expression_if_false;前面是条件,如果符合就等于冒号前的expression_if_true,反之则是后面的。2.如果要使用if(!node->left),要......
  • 【LeetCode Hot 100】4. 寻找两个正序数组的中位数
    题目描述要求出两个数组的中位数,第一想法当然是将这两个数组进行归并排序,然后直接得到排序后长数组的中位数。由于本题的两个数组都是排序后的数组,因此省去了排序的步骤。这种方法的时间复杂度为\(O(m+n)\),空间复杂度由于要存储排序后的长数组,所以也是\(O(m+n)\)。有没有相对更......
  • Leetcode 1492. n 的第 k 个因子
    1.题目基本信息1.1.题目描述给你两个正整数n和k。如果正整数i满足n%i==0,那么我们就说正整数i是整数n的因子。考虑整数n的所有因子,将它们升序排列。请你返回第k个因子。如果n的因子数少于k,请你返回-1。1.2.题目地址https://leetcode.cn/problems......
  • Day 19 回溯法part01| LeetCode 77.组合,216. 组合总和 III,17. 电话号码的字母组合
    理论基础回溯法(回溯搜索法)回溯函数就是递归函数本质是穷举解决的问题组合问题(不强调元素顺序,需去重)切割问题子集问题:一个N个数的集合里有多少符合条件的子集排列问题(强调元素顺序)棋盘问题:N皇后回溯法模板(可抽象为树形结构——N叉树来解决问题)递归返回值以及......
  • LeetCode_0146. LRU缓存
    题目描述请你设计并实现一个满足LRU(最近最少使用)缓存约束的数据结构。实现LRUCache类:LRUCache(intcapacity)以正整数作为容量capacity初始化LRU缓存intget(intkey)如果关键字key存在于缓存中,则返回关键字的值,否则返回-1。voidput(intkey,intval......
  • Day18 二叉树part08| LeetCode 669. 修剪二叉搜索树 , 108.将有序数组转换为二叉搜索树
    669.修剪二叉搜索树669.修剪二叉搜索树classSolution{publicTreeNodetrimBST(TreeNoderoot,intlow,inthigh){if(root==null)returnnull;//处理节点值<low的情况:当前节点及其左子树的所有节点都不在范围内,继续在其右子树上修......