leetcode-前k个高频元素(桶排序实现)

题目:
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

示例 2:

输入: nums = [1], k = 1
输出: [1]

说明:
你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。

package com.ljq.sort;

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

/** 
* @author 作者 Your-Name: 
* @version 创建时间:2019年8月27日 下午4:27:38 
* 类说明 
*/
public class BacketSort {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
Scanner scanner = new Scanner(System.in);
		
		while(scanner.hasNext()) {
			String[] strings = scanner.nextLine().split(" ");
			int len = strings.length;
			
			int k = Integer.parseInt(strings[0]);
			int[] nums = new int[len-1];
			for(int i=0;i ret = topKFrequent(nums,k);
			
			for(int x:ret) {
				System.out.print(x+" ");
			}
			System.out.println();
		}
		
		scanner.close();
	}
	
	public static List topKFrequent(int[] nums,int k){
		List ret =  new ArrayList();
		if(k>nums.length) {
			return ret;
		}
		
		Map map = new HashMap();
		for(int x:nums) {
			map.put(x, map.getOrDefault(x, 0)+1);
		}
		
		/*
		 * 设置若干桶,每个桶存储出现次数相同的数,桶的下表表示数字出现的次数
		 * 即第i个桶中存储频次为i的数
		 */
		/*
		 * 桶使用List数组实现,数组的每个元素都是list,桶的个数为数组的长度+1
		 */
		List[] buckets = new ArrayList[nums.length+1];
		for(Entry set:new ArrayList<>(map.entrySet())) {
			/*
			 * 如果数组为空,则创建list
			 */
			if(buckets[set.getValue()]==null) {
				buckets[set.getValue()] = new ArrayList();
			}
			/*
			 * 加入相应的key值
			 */
			buckets[set.getValue()].add(set.getKey());
		}
		
		int count = 0;
		for(int i=buckets.length-1;i>=0;i--) {
			if(buckets[i]!=null) {
				for(int in=0;in

你可能感兴趣的:(Leetcode)