1. 程式人生 > >Leetcode---前K個高頻元素--O(n)複雜度

Leetcode---前K個高頻元素--O(n)複雜度

前K個高頻元素

題目連結:前K個高頻元素

思路:

解法一:

  • 首先對整個陣列排序,複雜度O(nlgn)
  • 再對每個數字出現的頻度排序
  • 最後找出前K個數字

解法二:

  • 將陣列遍歷存入map集合中,value值存放出現次數
  • 構造一個長度為nums.length+1的lists陣列
  • 將頻度作為下標新增至lists[i]集合中
  • 最後按標從大到小遍歷,獲取集合中的值,新增至結果集,加入k個即可
	public List<Integer> topKFrequent(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<Integer,Integer>(); for(int num:nums) { map.put(num,map.getOrDefault(num, 0)+1); } //這裡加1的原因是不必單獨處理下標 List[] lists = new ArrayList[nums.length+1]; for(int key:map.keySet()) { //取出key值對應的元素個數 int temp = map.get(key); if(lists[temp]
==null) { lists[temp] = new ArrayList<Integer>(); } //這裡就是用list儲存的原因,因為同一個value值可能對應著好幾個key值 lists[temp].add(key); } List<Integer> result = new ArrayList<Integer>(); for(int i=lists.length-1;result.size()<k&&i>=0;--i) { if(lists[i]!=null) { result.
addAll(lists[i]); } } return result; }