LeetCode 1636. Sort Array by Increasing Frequency

原题链接在这里:https://leetcode.com/problems/sort-array-by-increasing-frequency/

题目:

Given an array of integers nums, sort the array in increasing order based on the frequency of the values. If multiple values have the same frequency, sort them in decreasing order.

Return the sorted array.

Example 1:

Input: nums = [1,1,2,2,2,3]
Output: [3,1,1,2,2,2]
Explanation: '3' has a frequency of 1, '1' has a frequency of 2, and '2' has a frequency of 3.

Example 2:

Input: nums = [2,3,1,3,2]
Output: [1,3,3,2,2]
Explanation: '2' and '3' both have a frequency of 2, so they are sorted in decreasing order.

Example 3:

Input: nums = [-1,1,-6,4,5,-6,1,4,1]
Output: [5,-1,4,4,-6,-6,1,1,1]

Constraints:

  • 1 <= nums.length <= 100
  • -100 <= nums[i] <= 100

题解:

HashMap to record num and its frequency.

Use bucket sort to add num into it corresponding frequency bucket.

Go through buckets and add value one by one.

Time Complexity: O(nlogk). n = nums.length. k is average size of bucket list item.

Space: O(n).

AC Java:

复制代码
 1 class Solution {
 2     public int[] frequencySort(int[] nums) {
 3         if(nums == null || nums.length == 0){
 4             return nums;
 5         }
 6         
 7         int n = nums.length;
 8         int [] res = new int[n];
 9         HashMap<Integer, Integer> hm = new HashMap<>();
10         for(int num : nums){
11             hm.put(num, hm.getOrDefault(num, 0) + 1);
12         }
13         
14         ArrayList<Integer>[] buckets = new ArrayList[n + 1];
15         for(Map.Entry<Integer, Integer> entry : hm.entrySet()){
16             int freq = entry.getValue();
17             if(buckets[freq] == null){
18                 buckets[freq] = new ArrayList<Integer>();
19             }
20             
21             for(int i = 0; i < freq; i++){
22                 buckets[freq].add(entry.getKey());
23             }
24         }
25         
26         int count = 0;
27         for(int i = 0; i <= n; i++){
28             if(buckets[i] != null){
29                 Collections.sort(buckets[i], (a, b) -> b - a);
30                 for(int num : buckets[i]){
31                     res[count++] = num;
32                 }
33             }
34         }
35         
36         return res;
37     }
38 }
复制代码

AC C++:

复制代码
 1 class Solution {
 2 public:
 3     vector<int> frequencySort(vector<int>& nums) {
 4         unordered_map<int, int> map;
 5         for(int num : nums){
 6             map[num]++;
 7         }
 8 
 9         sort(begin(nums), end(nums), [&](int a, int b){
10             return map[a] == map[b] ? a > b : map[a] < map[b];
11         });
12 
13         return nums;
14     }
15 };
复制代码

AC Python:

1 class Solution:
2     def frequencySort(self, nums: List[int]) -> List[int]:
3         count = collections.Counter(nums)
4         return sorted(nums, key = lambda x: (count[x], -x))

类似Top K Frequent ElementsSort Characters By FrequencyTop K Frequent Words.

posted @   Dylan_Java_NYC  阅读(41)  评论(0)    收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示