题目分析:
给定一个数组,返回数组中出现此多最多的k个元素,要求时间复杂度小于O(nlogn)。
解题思路:
1)利用map实现统计数组中每个元素出现的次数;
2)对1)统计的map按照元素出现的次数进行排序,此时需要自己定义一个变量,主要实现将map中元素与次数交换位置;
3)依据2)排序的结果,取出排序次数最靠前的k个元素对应的元素值即可。
实现程序
C++版本
// 此函数主要实现,将次数放在第一的位置,主要用于按照次数进行排序 class MAP1 { public: int time; int elem; MAP1(int _time, int _elem) { time = _time; elem = _elem; } bool operator < (const MAP1& obj)const { return time > obj.time; } }; class Solution { public: vector<int> topKFrequent(vector<int>& nums, int k) { int n = nums.size(); map<int, int> mp; map<int, int>::iterator it; // 统计nums中每个元素出现的次数 for (int i = 0; i < n; i++) { if (mp.find(nums[i]) == mp.end()) mp[nums[i]] = 1; else mp[nums[i]] += 1; } // 将mp中元素存放在Node数组中 vector<MAP1> p; for (it = mp.begin(); it != mp.end(); it++) p.push_back(MAP1(it->second, it->first)); // 对Node中的数组进行排序,即按照出现的次数进行排序 sort(p.begin(), p.end()); // 返回最终出现多于k次的元素 vector<int> result; for (int i = 0; i < k; i++) result.push_back(p[i].elem); return result; } };
Java版本
public List<Integer> topKFrequent(int[] nums, int k){ Map<Integer, Integer> count = new HashMap<Integer, Integer>(); // 统计nums中每个元素出现的次数 for (int i = 0; i < nums.length; i++){ if (count.containsKey(nums[i])) count.put(nums[i], count.get(nums[i]) + 1); else count.put(nums[i], 1); } // 重写排序算法 List<Map.Entry<Integer, Integer>> list = new ArrayList<Map.Entry<Integer, Integer>>(count.entrySet()); Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>(){ public int compare(Map.Entry<Integer, Integer>o1, Map.Entry<Integer, Integer> o2){ return o2.getValue().compareTo(o1.getValue()); } }); // 获得最终要获得的top k的元素 List<Integer> result = new ArrayList<Integer>(); for (int i = 0; i < k; i++) result.add(list.get(i).getKey()); return result;
}
参考文献
http://46aae4d1e2371e4aa769798941cef698.devproxy.yunshipei.com/qq_20581563/article/details/51305705
leetcode_347 Top K Frequent Elements
最新推荐文章于 2024-03-29 15:31:23 发布