タイトル説明
[]の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;
}
}