题目:
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. HashMap遍历数组nums[],得到每个元素的数组
2. 将HashMap中的记录,重新按照每个元素出现的次数,存放到list中,即bucket[i]中ki表示元素出现的个数,对应值bucket[ki]为元素值
3. 由于越靠后的元素,其出现的次数越多,因此,从后向前遍历k个非空bucket[],即为所求结果
程序:
class Solution {
public List<Integer> topKFrequent(int[] nums, int k) {
HashMap<Integer, Integer> record = new HashMap<Integer, Integer>();
for(int i = 0; i < nums.length; i++){
if(record.containsKey(nums[i]))
record.put(nums[i], record.get(nums[i])+1);
else
record.put(nums[i],1);
}
List<Integer>[] bucket=new List[nums.length+1];
for(int key:record.keySet()){
int count=record.get(key);
if(bucket[count]==null)
bucket[count]=new ArrayList<Integer>();
bucket[count].add(key);
}
List<Integer> result=new ArrayList<Integer>();
for(int i=nums.length;i>0;i--)
{
if(bucket[i]!=null&&result.size()<k)
result.addAll(bucket[i]);
}
return result;
}
}