數組中出現頻率爲k次的元素 Top K Frequent Elements

問題:算法

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

  • 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.

解決:.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;     } }

相關文章
相關標籤/搜索