【Hot100】LeetCode—347. 前 K 个高频元素

打印 上一主题 下一主题

主题 1031|帖子 1031|积分 3093




  • 原题毗连:347. 前 K 个高频元素

1- 思路

自界说Node结点 + 哈希表实现



  • ① 自界说 Node 结点:

    • 自界说 Node 结点中有 value 和 cnt 字段,此中 value 为详细的数字,cnt 为详细的值
    • 实现 ① getCnt② addCnt、**③ getVal **方法

  • ② 哈希表实现

    • 使用HashMap,此中 key 存储对应的数组值,value 存储为 Node,Node的value为值,cnt 为次数

  • 如果首次遇见则参加到 ArrayList中,借助 ArrayList 使用 Lambda 表达式实现快速的排序,收集结果

2- 实现

347. 前 K 个高频元素——题解思路


  1. class Node{
  2.     int value;
  3.     int cnt;
  4.     public Node(int v,int c){
  5.         value = v;
  6.         cnt = c;
  7.     }
  8.     public int getValue(){
  9.         return value;
  10.     }
  11.     public int getCnt(){
  12.         return cnt;
  13.     }
  14.     public void addCnt(){
  15.         cnt++;
  16.     }
  17. }
  18. class Solution {
  19.     public int[] topKFrequent(int[] nums, int k) {
  20.         HashMap<Integer,Node> map = new HashMap<>();
  21.         ArrayList<Node> list = new ArrayList<>();
  22.         // 遍历 nums
  23.         for(int i = 0 ; i < nums.length ; i++){
  24.             if(map.containsKey(nums[i])){
  25.                 // 执行 ++
  26.                 map.get(nums[i]).addCnt();
  27.             }else{
  28.                 // 新建
  29.                 Node newNode = new Node(nums[i],1);
  30.                 map.put(nums[i],newNode);
  31.                 list.add(newNode);
  32.             }
  33.         }
  34.         Collections.sort(list,(o1,o2) -> o2.getCnt() - o1.getCnt());
  35.         int[] res = new int[k];
  36.         for(int i = 0 ; i < k ; i++){
  37.             res[i] = list.get(i).getValue();
  38.         }
  39.         return res;
  40.     }
  41. }
复制代码

3- ACM实现

  1. package Daily_LC.Month9_Week1.Day147;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.HashMap;
  5. import java.util.Scanner;
  6. /**
  7. * getK
  8. *
  9. * @author alcohol
  10. * @Description
  11. * @since 2024-09-07 15:47
  12. */
  13. public class getK {
  14.     static class Node{
  15.         int val;
  16.         int cnt;
  17.         public Node(int v,int c){
  18.             val = v;
  19.             cnt = c;
  20.         }
  21.         public int getVal(){
  22.             return val;
  23.         }
  24.         public int getCnt(){
  25.             return cnt;
  26.         }
  27.         public void addCnt(){
  28.             cnt++;
  29.         }
  30.     }
  31.     public static int[] getBeforeK(int[] nums ,int k){
  32.         // 寻找前 k 个
  33.         // 1. 自定义Node  和 哈希表
  34.         HashMap<Integer,Node> map = new HashMap<>();
  35.         ArrayList<Node> list = new ArrayList<>();
  36.         // 遍历填 map
  37.         for(int i = 0 ; i < nums.length;i++){
  38.             if(map.containsKey(nums[i])){
  39.                 map.get(nums[i]).addCnt();
  40.             }else{
  41.                 Node newNode = new Node(nums[i],1);
  42.                 map.put(nums[i],newNode);
  43.                 list.add(newNode);
  44.             }
  45.         }
  46.         // 排序
  47.         Collections.sort(list,(o1,o2) -> o2.getCnt() - o1.getCnt());
  48.         int[] res = new int[k];
  49.         for(int i = 0 ; i < k;i++){
  50.             res[i] = list.get(i).getVal();
  51.         }
  52.         return res;
  53.     }
  54.     public static void main(String[] args) {
  55.         Scanner sc = new Scanner(System.in);
  56.         String input = sc.nextLine();
  57.         String[] parts = input.split(" ");
  58.         int[] nums = new int[parts.length];
  59.         for(int i = 0 ; i < nums.length ; i++){
  60.             nums[i] = Integer.parseInt(parts[i]);
  61.         }
  62.         System.out.println("输入K");
  63.         int k = sc.nextInt();
  64.     }
  65. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

道家人

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表