leetcode347:Top K Frequent Elements(medium)

来源:互联网 发布:南宁知远科技有限公司 编辑:程序博客网 时间:2024/06/14 00:54

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


0 0