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 @ 2022-06-26 15:21  Dylan_Java_NYC  阅读(38)  评论(0编辑  收藏  举报