> 文档中心 > 【力扣题解】1838. 最高频元素的频数

【力扣题解】1838. 最高频元素的频数


😊博主目前也在学习,有错误欢迎指正😊
🌈保持热爱 奔赴星海🌈

文章目录

    • 一、题目
      • 1、题目描述
      • 2、基础框架
      • 3、原题链接
    • 二、解题报告
      • 1、思路分析
      • 2、代码详解
    • 三、本题知识

一、题目

1、题目描述

元素的 频数 是该元素在一个数组中出现的次数。
给你一个整数数组 nums 和一个整数 k 。在一步操作中,你可以选择 nums 的一个下标,并将该下标对应元素的值增加 1 。

执行最多 k 次操作后,返回数组中最高频元素的 最大可能频数 。

2、基础框架

  • Java版本框架代码如下:
class Solution {    public int maxFrequency(int[] nums, int k) {    }}

3、原题链接

1838. 最高频元素的频数

二、解题报告

1、思路分析

       (1)定义一个sum数组,计算出nums数组的前缀和。
       (2)遍历sum数组,计算把i到j区间内的数都变成num[j]需要操作几次(设为s次),若s>k那么i++。当s<=k时,计算区间长度。每次遍历取最小值。

2、代码详解

class Solution {    public int maxFrequency(int[] nums, int k) { Arrays.sort(nums); int n = nums.length; int j = 0; int i = 0; int[] sum = new int[n + 1]; for(i = 1;i <= n;i++) {     sum[i] += sum[i - 1] + nums[i - 1]; } int ans = 0; i = 0; for(j = 1;j <= n;j++) {     long s = (sum[j] - sum[j - 1])*(j - i) - (sum[j] - sum[i]);     while(s > k) {  i++;  s = (sum[j] - sum[j - 1])*(j - i) - (sum[j] - sum[i]);     }     ans = Math.max(ans,j - i); } return ans;    }}

三、本题知识

前缀和