1. 问题描述
给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。
请你返回排序后的数组。
2. 解题思路
- 维护一个数组 cnt 记录元素出现次数,该数组下标为 nums 数组的元素的值
3. 实现代码
class Solution {
public int[] frequencySort(int[] nums) {
int[] cnt = new int[201];
for (int num : nums) {
++cnt[num + 100];
}
// lists数组中的索引代表数字的个数
List<Integer>[] lists = new List[101];
for (int i = 0; i < cnt.length; i++) {
if (cnt[i] == 0) {
continue;
}
if (lists[cnt[i]] == null) {
lists[cnt[i]] = new ArrayList<>();
}
lists[cnt[i]].add(i - 100);
}
int idx = 0;
for (int i = 0; i < 101; i++) {
if (lists[i] == null) {
continue;
}
// 降序排列,倒序处理
for (int j = lists[i].size() - 1; j >= 0; j--) {
for (int k = 0; k < i; k++) {
nums[idx++] = lists[i].get(j);
}
}
}
return nums;
}
}