1. 程式人生 > >【LeetCode】347. Top K Frequent Elements

【LeetCode】347. Top K Frequent Elements

Given a non-empty array of integers, return the k most frequent elements.

Example 1: 

Input: nums = [1,1,1,2,2,3], k = 2

Output: [1,2]

Example 2:

Input: nums = [1], k = 1

Output: [1]

Note:

  • You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
  • Your algorithm's time complexity must be
     better than O(n log n), where n is the array's size.

我的解法:桶排序(Bucket Sort)時間複雜度O(n)。

1. 遍歷陣列nums,利用字典HashMap統計各元素出現次數。 2. 遍歷HashMap,利用巢狀列表ArrayList記錄出現次數為i( i∈[1, n] )的所有元素 3. 逆序遍歷ArrayList,將其中的前k個元素輸出。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Leet347Top_K {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] array = {1,1,1,2,2,3};
		List<Integer> res = topKFrequent(array, 2);
		for (int a : res) {
			System.out.print(a + " ");
		}
		
	}
	
	public static List<Integer> topKFrequent(int[] nums, int k){
		//計算每一個元素出現的次數
		HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
		for(int num : nums) {
			if(map.containsKey(num)) {
				map.put(num, map.get(num)+1);
			} else {
				map.put(num, 1);
			}
		}
		
		//得到最頻繁出現的
		int max = 0;
		for(Map.Entry<Integer, Integer> entry : map.entrySet()) {
			max = Math.max(max, entry.getValue());
		}
		
		//初始化一個ArrayList。索引是出現的次數,ArrayList的值是數。
		ArrayList<Integer>[] arr = (ArrayList<Integer>[]) new ArrayList[max + 1];
		for(int i=1; i<=max; i++) {
			arr[i] = new ArrayList<Integer>();
		}
		
	    for(Map.Entry<Integer, Integer> entry: map.entrySet()){
	        int count = entry.getValue();
	        int number = entry.getKey();
	        arr[count].add(number);
	    }
	    
	    List<Integer> result = new ArrayList<Integer>();
	    
	    //add most frequent numbers to result
	    for(int j=max; j>=1; j--){
	        if(arr[j].size()>0){
	            for(int a: arr[j]){
	                result.add(a);
	                //if size==k, stop
	                if(result.size()==k){
	                    return result;
	                }
	            }
	        }
	    }
	    
	    return null;
	    
	}

}