問題:算法
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]
.ide
Note: spa
解決:.net
① 使用map記錄出現的次數,並根據map的值進行降序排序。時間O(n log n),空間O(n)code
class Solution { //30ms
public List<Integer> topKFrequent(int[] nums, int k) {
List<Integer> res = new ArrayList<>();
Map<Integer,Integer> map = new HashMap<>();
for (int i = 0;i < nums.length;i ++){
map.put(nums[i],map.getOrDefault(nums[i],0) + 1);
}
List<Map.Entry<Integer,Integer>> tmp = new ArrayList<>(map.entrySet());
Collections.sort(tmp, new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
return o2.getValue().compareTo(o1.getValue());//降序
}
});
int count = 0;
for (Map.Entry<Integer,Integer> entry : tmp){
count ++;
if (count > k) break;
res.add(entry.getKey());
}
return res;
}
}排序
② 桶排序。以[6 2 4 1 5 9]爲例。element
準備10個空桶,最大數個空桶。rem
1,順序從待排數組中取出數字,首先6被取出,而後把6入6號桶,這個過程相似這樣:空桶[ 待排數組[ 0 ] ] = 待排數組[ 0 ]get
[6 2 4 1 5 9] 待排數組
[0 0 0 0 0 0 6 0 0 0] 空桶
[0 1 2 3 4 5 6 7 8 9] 桶編號(實際不存在)
2,順序從待排數組中取出下一個數字,此時2被取出,將其放入2號桶,是幾就放幾號桶
[6 2 4 1 5 9] 待排數組
[0 0 2 0 0 0 6 0 0 0] 空桶
[0 1 2 3 4 5 6 7 8 9] 桶編號(實際不存在)
3,4,5,6省略,過程同樣,所有入桶後變成下邊這樣
[6 2 4 1 5 9] 待排數組
[0 1 2 0 4 5 6 0 0 9] 空桶
[0 1 2 3 4 5 6 7 8 9] 桶編號(實際不存在)
1,桶排序是穩定的
2,桶排序是常見排序裏最快的一種,比快排還要快…大多數狀況下
3,桶排序很是快,可是同時也很是耗空間,基本上是最耗空間的一種排序算法
class Solution { //13ms public List<Integer> topKFrequent(int[] nums, int k) { List<Integer> res = new ArrayList<>(); if (nums == null || nums.length == 0) return res; Arrays.sort(nums); int max = 1;//記錄最大出現次數 int count = 1;//記錄出現次數 for (int i = 1;i < nums.length;i ++){ if (nums[i] == nums[i - 1]){ count ++; max = Math.max(max,count); }else { count = 1; } } List<Integer>[] bucket = new ArrayList[max + 1]; count = 1; for (int i = 1;i < nums.length + 1;i ++){ if (i < nums.length && (nums[i - 1] == nums[i])){ count ++; }else { if (bucket[count] == null){ bucket[count] = new ArrayList<>(); } bucket[count].add(nums[i - 1]); count = 1; } } count = 0; for (int i = max;i >= 1;i --){ List<Integer> tmp = bucket[i]; while(tmp != null && ! tmp.isEmpty()){ res.add(tmp.remove(0)); count ++; if (count == k) break; } if(count == k) break; } return res; } }