【LeetCode】347. Top K Frequent Elements

版权声明:本文为博主原创文章,欢迎大家转载,但是要注明我的文章地址。 https://blog.csdn.net/program_developer/article/details/82771686

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;
	    
	}

}

猜你喜欢

转载自blog.csdn.net/program_developer/article/details/82771686