Java如何找出陣列中前k個高頻元素
阿新 • • 發佈:2019-01-13
比如,一個數組為:[1,2,3,5,2,3,5,7,7,7,5,7 ]前2個高頻元素就是7和5。
思路:最簡單的辦法就是採用兩層for迴圈去遍歷,時間複雜度為O(n2)。
方法二:先用快速排序將陣列排序,然後依次找出前k個高頻元素,時間複雜度O(NLogN)。
方法三:可以採用HashMap,這種方式時間複雜度為O(N),空間複雜度O(N)。
下面採用第三種方式:
public class test {
//定義統計數組裡每個數字出現的次數HashMap; static HashMap<Integer, Integer> map; public static void main(String[] args) { int[] num = {1,2,3,5,2,3,5,7,7,7,5,7}; ArrayList<Integer> nums = topK(num,4); System.out.println(nums); }
public static ArrayList<Integer> topK(int[] numbers , int k){ map = new HashMap<Integer,Integer>(); for(int i = 0; i<numbers.length; i++){ Integer count = map.get(numbers[i]); if(count ==null){ count=0; } map.put(numbers[i], count+1); } //構造一個數組來放map中的key; List<Integer>[] keyList = new List[numbers.length]; for(int key:map.keySet()){ //map中數出現的次數; int a = map.get(key); //將map中的key放在arrayList的裡 if(keyList[a]==null){ ArrayList<Integer> temp = new ArrayList<Integer>(); temp.add(key); keyList[a] = temp; }else{ keyList[a].add(key); } } ArrayList<Integer> res = new ArrayList<Integer>(); for(int i=keyList.length-1;i>=0&&res.size()<k;i--){ if(keyList[i]!=null){ res.addAll(keyList[i]); } } return res; } }