【2022-09-19每日一题】1636. 按照频率将数组升序排序

2022-09-19
1分钟阅读时长

2022-09-19每日一题:1636. 按照频率将数组升序排序

难度:Easy

标签:数组 、 哈希表 、 排序

给你一个整数数组 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]

提示:

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

方法一:模拟

func frequencySort(nums []int) []int {
    mp := make(map[int]int)
    for _, num := range nums {
        mp[num]++
    }
    slice := make([][2]int, 0, len(mp))
    for num, count := range mp {
        slice = append(slice, [2]int{count, num})
    }
    sort.Slice(slice, func (i, j int) bool {
        if slice[i][0] == slice[j][0] {
            return slice[i][1] > slice[j][1]
        } else {
            return slice[i][0] < slice[j][0]
        }
    })
    ans := make([]int, 0, len(nums))
    for _, p := range slice {
        for i := 0; i < p[0]; i++ {
            ans = append(ans, p[1])
        }
    }
	return ans
}

复杂度分析

  • 时间复杂度:O(nlogn)

  • 空间复杂度:O(n)

方法二:

详细思路过程见官方题解,这里只做个人刷题记录,方便后续查询阅读

func frequencySort(nums []int) []int {
    cnt := make(map[int]int)
    for _, num := range nums {
        cnt[num]++
    }
    sort.Slice(nums, func (i, j int) bool {
        a, b := nums[i], nums[j]
        // 先比较数出现次数升序,如果次数相同则按数的大小倒序
        return cnt[a] < cnt[b] || cnt[a] == cnt[b] && a > b
    })
	return nums
}

复杂度分析

  • 时间复杂度:O(nlogn),其中 n 是数组nums 的长度。排序消耗 O(nlogn) 时间。

  • 空间复杂度:O(n),存储数组元素频率的哈希表消耗 O(n)空间。

LeetCode题库地址