前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode笔记:347. Top K Frequent Elements

LeetCode笔记:347. Top K Frequent Elements

作者头像
Cloudox
发布2021-11-23 15:33:42
1370
发布2021-11-23 15:33:42
举报
文章被收录于专栏:月亮与二进制月亮与二进制

问题:

Given a non-empty array of integers, return the k most frequent elements. For example, Given [1,1,1,2,2,3] and k = 2, return [1,2]. Note:

  • You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
  • Your algorithm's time complexity must be better than O(n log n), where n is the array's size.

大意:

给出一个非空的整型数组,返回最频繁的k个元素。 例子: 给出 [1,1,1,2,2,3] 和 k = 2,返回 [1,2]。 注意:

  • 你可以假设k始终是有效的,1 ≤ k ≤ 不同的元素数。
  • 你的算法时间复杂度要少于O(nlogn),n是数组的尺寸。

思路:

我们要知道哪些数字出现的最多,以及对应的次数,肯定要先遍历一遍并记录下各个数字出现的次数,这里我们用一个HashMap来记录,数字为key,值为它们出现的次数。

接着循环查找出现的最多、次多...的数字,并添加到结果中去。

代码(Java):

代码语言:javascript
复制
public class Solution {
    public List<Integer> topKFrequent(int[] nums, int k) {
        
        Map<Integer, String> map = new HashMap<Integer, String>();
        for (int i = 0; i < nums.length; i++) {
            if (map.containsKey(nums[i])) {// 记录过
                String numStr = map.get(nums[i]);
                int num = Integer.valueOf(numStr).intValue();
                num ++;
                map.put(nums[i], String.valueOf(num));
            } else {// 没记录过
                map.put(nums[i], "1");
            }
        }
        
        int[] keyArr = new int[map.size()];
        int[] valueArr = new int[map.size()];
        int[] used = new int[map.size()];
        int index = 0;
        for (Integer key : map.keySet()) {  
            keyArr[index] = key;
            System.out.println(key);
            valueArr[index] = Integer.valueOf(map.get(key)).intValue();
            System.out.println(map.get(key));
            index ++;
        }  
        
        List<Integer> result = new ArrayList<Integer>();
        while (k > 0) {
            int biggest = 0;
            for (int i = 0; i < used.length; i++) {
                if (used[i] != 1) {
                    biggest = i;
                    break;
                }
            }
            for (int i = 0; i < valueArr.length; i++) {
                if (valueArr[i] > valueArr[biggest] && used[i] != 1) biggest = i;
            }
            result.add(keyArr[biggest]);
            k --;
            used[biggest] = 1;
        }
        
        return result;
        
    }
}

合集:https://github.com/Cloudox/LeetCode-Record

查看作者首页

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/11/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题:
  • 大意:
  • 思路:
  • 代码(Java):
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档