一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第26天,点击查看活动详情。
题目描述
给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。
请你返回排序后的数组。
示例 1:
输入:nums = [1,1,2,2,2,3]
输出:[3,1,1,2,2,2]
解释:'3' 频率为 1,'1' 频率为 2,'2' 频率为 3 。
示例 2:
输入:nums = [2,3,1,3,2]
输出:[1,3,3,2,2]
解释:'2' 和 '3' 频率都为 2 ,所以它们之间按照数值本身降序排序。
示例 3:
输入:nums = [-1,1,-6,4,5,-6,1,4,1]
输出:[5,-1,4,4,-6,-6,1,1,1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-array-by-increasing-frequency
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路分析
- 今天的算法题目是数组排序题目,这个题目的要求先按照频率升序排序,如果频率相同,按照数值降序排序。
- 根据题目要求,我们先使用 hashmap 统计出每个字符出现的频率。然后构造一个当前数值,频率对的二维数组。对二维数组,先按照频率升序排序,如果频率相同,按照数值降序排序。
- 题目思路没有什么难度,考察的是代码编程的基本功底,熟练使用 API的能力,实现代码如下,供参考。
通过代码
class Solution {
public int[] frequencySort(int[] nums) {
int n = nums.length;
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < n; i++) {
map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
}
int[][] temp = new int[n][2];
for (int i = 0; i < n; i++) {
temp[i] = new int[]{nums[i], map.get(nums[i])};
}
Arrays.sort(temp, new Comparator<int[]>(){
@Override
public int compare(int[] a, int[] b) {
if (a[1] == b[1]) {
return b[0] - a[0];
} else {
return a[1] - b[1];
}
}
});
int[] ans = new int[n];
for (int i = 0; i < n; i++) {
ans[i] = temp[i][0];
}
return ans;
}
}
总结
- 上述算法的时间复杂度是O(n * log n ), 空间复杂度是O(n)
- 坚持算法每日一题,加油!