leetcode 1636. 按照频率将数组升序排序

一、题目

1.题目描述

给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。

请你返回排序后的数组。

提升:

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

2. 题目链接

1636. 按照频率将数组升序排序

二、解题报告

1.思路

  • 统计每个数出现的频次计数,值的范围是-100~100
int[] cnt = new int[201];

for(int num: nums){
   cnt[num + 100]++;
}
  • 定义一个新数,使得新数能够经过排序后实现频率升序,按照数值降序的效果
  • 满足频率升序,可以将频次数组乘以一个大于整数数组最大值的数,即
nums[i] =  201 * cnt[nums[i] + 100];
  • 满足数值降序,则需要在频率相同时,数值大的变得更小,减去本身即可。本题考虑到统计频次时,对每个数都增加了100,即
nums[i] =  201 * cnt[nums[i] + 100] - nums[i] + 100;
  • 对新数排序
  • 将新数转换为原数
  • 转换公式粗略表示为:
    y = 201 ∗ k − x + 100 y = 201 * k - x+100 y=201kx+100
    y m o d ( 201 ) = − x + 100 y mod( 201) = -x + 100 ymod(201)=x+100

2.代码实现

class Solution {
    public int[] frequencySort(int[] nums) {
        int[] cnt = new int[201];

        for(int num: nums){
            cnt[num + 100]++;
        }

        for(int i = 0; i < nums.length; i++){
            //201 * cnt[] 满足按照频次排序
            // - nums[] + 100 数值越大的,占比越小
            nums[i] = 201 * cnt[nums[i] + 100] - nums[i] + 100;
        }

        Arrays.sort(nums);

        //转换规则: x = 201 * k - y + 100
        //x % 201 = -y + 100
        for(int i = 0; i < nums.length; i++){
            nums[i] = 100 - nums[i] % 201;
        }

        return nums;
    }
}

3.实现结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值