今天晚饭前又做了一道leetcode,今天真的是给自己放假了,学了一天习,非常充实,言归正传,这道题用到的思想就一个:桶排序!
题意:Given a non-empty array of integers, return the k most frequent elements
例如:Given [1,1,1,2,2,3]
and
k = 2, return [1,2]
.
思想:1.创建一个HashMap,遍历一遍数组,key为数组中的数字,value为该数字出现的次数,2.之后,再创建一个“桶”用于排序,这个桶是一个二维数组,在java里就是ArrayList<ArrayList<Integer>>,初始化这个桶数组的大小是传入数组的大小再加1,因为。。。。(桶排序的原理不多介绍,大概意思就是二维数组的索引m对应的一维ArrayList<Integer>代表的是在传入的数组中出现m次的数字组成的数组!!!)3.再遍历一遍HashMap,从而可以完成这个二维数组的建立。4.最后一步便可倒序遍历这个二维数组,根据传入的k值,再从中选出k个出现次数最多的数字,返回即可。该算法就写完了,其实很简单,主要就是用HashMap统计数字及其出现次数,再桶排序!程序如下:
public List<Integer> topKFrequent(int[] nums, int k) {
int size = nums.length;
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i=0;i<size;i++){
<span style="white-space:pre"> </span>if(map.containsKey(nums[i]))
<span style="white-space:pre"> </span>map.put(nums[i], map.get(nums[i])+1);
<span style="white-space:pre"> </span>else
<span style="white-space:pre"> </span>map.put(nums[i], 1);
}
//初始化桶
ArrayList<ArrayList<Integer>> tong = new ArrayList<ArrayList<Integer>>();
for(int i=0;i<size+1;i++){
<span style="white-space:pre"> </span>tong.add(new ArrayList<Integer>());
}
//遍历HashMap,创建桶
for(Integer key : map.keySet()){
<span style="white-space:pre"> </span>tong.get(map.get(key)).add(key);
}
<span style="white-space:pre"> </span> //从桶中倒序遍历,选择出现最多的k个数字,add到result中,返回result即可
ArrayList<Integer> result = new ArrayList<Integer>();
int num = k;
for(int i =size;i>=0;i--){
<span style="white-space:pre"> </span>if(tong.get(i).size() <= 0)
<span style="white-space:pre"> </span>continue;
<span style="white-space:pre"> </span>else{
<span style="white-space:pre"> </span>if(tong.get(i).size()<num){
<span style="white-space:pre"> </span>num -= tong.get(i).size();
<span style="white-space:pre"> </span>for(int j=0;j<tong.get(i).size();j++)
<span style="white-space:pre"> </span>result.add(tong.get(i).get(j));
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>else{
<span style="white-space:pre"> </span>for(int j=0;j<num;j++)
<span style="white-space:pre"> </span>result.add(tong.get(i).get(j));
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
}
return result;
}