給定一個非空的整數數組,返回其中出現頻率前 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 是數組的大小。
解法1:
public List<Integer> topKFrequent(int[] nums, int k) {
List<Integer> res = new ArrayList<>();
Map<String, Integer> m = new HashMap<>();
for (int num : nums) {
m.put(num + "", m.getOrDefault(num + "", 0) + 1);
}
List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(m.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return o2.getValue() - o1.getValue();
}
});
for (int i = 0; i < k; i++) {
res.add(Integer.parseInt(list.get(i).getKey()));
}
return res;
}
解法2:
public static List<Integer> topKFrequent(int[] nums, int k) {
List<Integer> res = new ArrayList<>();
Map<Integer, Integer> m = new HashMap<>();
for (int num : nums) {
m.put(num, m.getOrDefault(num, 0) + 1);
}
List<Integer>[] list = new List[nums.length + 1];
for (int key : m.keySet()) {
int val = m.get(key);
if (list[val] == null) {
list[val] = new ArrayList<>();
}
list[val].add(key);
}
for (int i = list.length - 1; i >= 0 && res.size() < k; i--) {
if (list[i] == null)
continue;
res.addAll(list[i]);
}
return res;
}