题目
给你一个整数数组 nums
,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。
请你返回排序后的数组。
难度:简单
提示:
1 <= nums.length <= 100
-100 <= nums[i] <= 100
题解
按照题意,统计词频,再按词频排序即可。
注意在Java中是不支持对基本类型的数组自定义排序的,所以,这里我们需要要用Integer[] 数组。
class Solution {
public int[] frequencySort(int[] nums) {
Integer[] arr = new Integer[nums.length];
int[] freqs = new int[201];
for (int i = 0; i < nums.length; i++) {
// 统计频次
freqs[nums[i] + 100]++;
//将int数组转换成Integer数组
arr[i] = nums[i];
}
// Java中不支持对基本类型的数组自定义排序
Arrays.sort(arr, (a, b) -> {
// 按照频次排序
return freqs[a + 100] == freqs[b + 100] ? b - a : freqs[a + 100] - freqs[b + 100];
// 如果两个数的频次相同,那么这两个数就按照从大到小排序(后者减去前者)
// 频次不相同,则按照频次排序
});
// 转换为int数组
for (int i = 0; i < nums.length; i++) {
nums[i] = arr[i];
}
return nums;
}
}
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(n+C)