leetcode347:Top K Frequent Elements(medium)

今天晚饭前又做了一道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;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值