Leetcode---前K個高頻元素--O(n)複雜度
阿新 • • 發佈:2018-12-08
前K個高頻元素
題目連結:前K個高頻元素
思路:
解法一:
- 首先對整個陣列排序,複雜度O(nlgn)
- 再對每個數字出現的頻度排序
- 最後找出前K個數字
解法二:
- 將陣列遍歷存入map集合中,value值存放出現次數
- 構造一個長度為nums.length+1的lists陣列
- 將頻度作為下標新增至lists[i]集合中
- 最後按標從大到小遍歷,獲取集合中的值,新增至結果集,加入k個即可
public List<Integer> topKFrequent(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int num:nums) {
map.put(num,map.getOrDefault(num, 0)+1);
}
//這裡加1的原因是不必單獨處理下標
List[] lists = new ArrayList[nums.length+1];
for(int key:map.keySet()) {
//取出key值對應的元素個數
int temp = map.get(key);
if(lists[temp] ==null) {
lists[temp] = new ArrayList<Integer>();
}
//這裡就是用list儲存的原因,因為同一個value值可能對應著好幾個key值
lists[temp].add(key);
}
List<Integer> result = new ArrayList<Integer>();
for(int i=lists.length-1;result.size()<k&&i>=0;--i) {
if(lists[i]!=null) {
result. addAll(lists[i]);
}
}
return result;
}