問(wèn)題:
Given a non-empty array of integers, return the k most frequent elements.
For example,
Given [1,1,1,2,2,3] and k = 2, return [1,2].
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.
大意:
給出一個(gè)非空的整型數(shù)組恭朗,返回最頻繁的k個(gè)元素。
例子:
給出 [1,1,1,2,2,3] 和 k = 2依疼,返回 [1,2]痰腮。
注意:
- 你可以假設(shè)k始終是有效的,1 ≤ k ≤ 不同的元素?cái)?shù)律罢。
- 你的算法時(shí)間復(fù)雜度要少于O(nlogn)膀值,n是數(shù)組的尺寸。
思路:
我們要知道哪些數(shù)字出現(xiàn)的最多误辑,以及對(duì)應(yīng)的次數(shù)沧踏,肯定要先遍歷一遍并記錄下各個(gè)數(shù)字出現(xiàn)的次數(shù),這里我們用一個(gè)HashMap來(lái)記錄巾钉,數(shù)字為key翘狱,值為它們出現(xiàn)的次數(shù)。
接著循環(huán)查找出現(xiàn)的最多砰苍、次多...的數(shù)字潦匈,并添加到結(jié)果中去阱高。
代碼(Java):
public class Solution {
public List<Integer> topKFrequent(int[] nums, int k) {
Map<Integer, String> map = new HashMap<Integer, String>();
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(nums[i])) {// 記錄過(guò)
String numStr = map.get(nums[i]);
int num = Integer.valueOf(numStr).intValue();
num ++;
map.put(nums[i], String.valueOf(num));
} else {// 沒(méi)記錄過(guò)
map.put(nums[i], "1");
}
}
int[] keyArr = new int[map.size()];
int[] valueArr = new int[map.size()];
int[] used = new int[map.size()];
int index = 0;
for (Integer key : map.keySet()) {
keyArr[index] = key;
System.out.println(key);
valueArr[index] = Integer.valueOf(map.get(key)).intValue();
System.out.println(map.get(key));
index ++;
}
List<Integer> result = new ArrayList<Integer>();
while (k > 0) {
int biggest = 0;
for (int i = 0; i < used.length; i++) {
if (used[i] != 1) {
biggest = i;
break;
}
}
for (int i = 0; i < valueArr.length; i++) {
if (valueArr[i] > valueArr[biggest] && used[i] != 1) biggest = i;
}
result.add(keyArr[biggest]);
k --;
used[biggest] = 1;
}
return result;
}
}
合集:https://github.com/Cloudox/LeetCode-Record