(Java)のleetcode-347トップK頻繁な要素

タイトル説明

[]のk番目の周波数の要素は、
前部戻り高周波数k・エレメントが表示される整数の非空の配列、所与。

例1:

入力:NUMS = [1,1,1,2,2,3]、K = 2
出力:[1,2]
実施例2:

入力:NUMS = [1]、K = 1
出力:[1]
説明:

あなたは、常に与えられた合理的なKを想定し、1つの≤K≤配列の異なる要素の数をすることができます。
アルゴリズムのあなたの時間の複雑さは、(N Nログ)Oよりも良く、nは配列のサイズである必要があります。

思考

メモリ内に表示されるデジタル地図の頻度、Oの時間複雑度(N)に対応した
対応に、番号が表示さを設定し、異なる周波数に対して、周波数標準としてアレイ、アレイを作成する(バケットソート順序の周波数を使用して配列の添字)、バケットの数であり、N + 1、バケットソートの時間計算量はO(N)であるので、
したがって、合計時間はO(N)であります
ここに画像を挿入説明

コード

class Solution {
	public List<Integer> topKFrequent(int[] nums, int k) {

		List<Integer>[] bucket = new List[nums.length + 1];
		Map<Integer, Integer> frequencyMap = new HashMap<Integer, Integer>();
		// 把数字与对应出现的频率存到map中
		for (int n : nums) {
			frequencyMap.put(n, frequencyMap.getOrDefault(n, 0) + 1);
		}

		// 桶排序
        // 将频率作为数组下标,对于出现频率不同的数字集合,存入对应的数组下标
		for (int key : frequencyMap.keySet()) {
			int frequency = frequencyMap.get(key);
			if (bucket[frequency] == null) {
				bucket[frequency] = new ArrayList<>();
			}
			bucket[frequency].add(key);
		}

		List<Integer> res = new ArrayList<>();
		// 倒序遍历数组获取出现顺序从大到小的排列
		for (int pos = bucket.length - 1; pos >= 0 && res.size() < k; pos--) {
			if (bucket[pos] != null) {
				res.addAll(bucket[pos]);
			}
		}
		return res;
	}
}

結果を発表

ここに画像を挿入説明

公開された143元の記事 ウォン称賛45 ビュー70000 +

おすすめ

転載: blog.csdn.net/z714405489/article/details/103163272