LeetCode 每日一题「最高频元素的频数」

示例3:

  • 输入:nums = [3,9,6], k = 2

  • 输出:1

提示

  • 1 <= nums.length <= 105

  • 1 <= nums[i] <= 105

  • 1 <= k <= 105

题目来源:LeetCode

分析



最简单的解法就是使用暴力法,先对原数组进行排序,然后对数组中的每一个元素,对它前面的元素往前遍历,在操作次数不超过 k 的情况下,频数加一,直到操作次数超过 k 则终止。时间复杂度为 O(n^2)。

package com.chenpi;

import java.util.Arrays;

/**

  • @Description

  • @Author 陈皮

  • @Date 2021/7/19

  • @Version 1.0

*/

public class MaxFrequency {

public int maxFrequency(int[] nums, int k) {

// 从小到大排序

Arrays.sort(nums);

// 记录滑动过程中的最大频数

int max = 0;

// 从左往后(小到大)遍历每一个元素nums[j],判断它是否那个最大频数的元素

for (int j = 0; j < nums.length; j++) {

int i = j;

int tempK = k;

while (i >= 0 && ((nums[j] - nums[i]) <= tempK)) {

tempK -= nums[j] - nums[i];

i–;

}

max = Math.max(max, j - i);

}

return max;

}

public static void main(String[] args) {

MaxFrequency maxFrequency = new MaxFrequency();

int[] nums = {1, 2, 4};

System.out.println(maxFrequency.maxFrequency(nums, 5));

}

}

不过上述解法在数组长度很大的时候,执行比较耗时。其实这道题考察的是滑动窗口解法,先将数组从小到大排序,然后遍历数组每一个元素,看它的左边窗口最大长度即这个元素的频数,然后求出这些频数的最大值即可。

package com.chenpi;

import java.util.Arrays;

/**

  • @Description

  • @Author 陈皮

  • @Date 2021/7/19

  • @Version 1.0

*/

public class MaxFrequency {

public int maxFrequency(int[] nums, int k) {

// 从小到大排序

Arrays.sort(nums);

// 记录滑动过程中的最大频数

int max = 0;

int tempSum = 0;

// 从左往后(小到大)遍历每一个元素nums[j],判断它是否那个最大频数的元素

for (int i = 0, j = 0; j < nums.length; j++) {

// j-i是滑动窗口元素的个数(排除窗口内最后一个元素nums[j])

// nums[j] * (j - i) - tempSum 窗口前面几个元素的差值

// 如果差值超过k则代表不满足,左窗口需要往后滑动一位,并减去这个调出窗口的元素值

while (nums[j] * (j - i) - tempSum > k) {

tempSum -= nums[i++];

}

// 右窗口往后滑动一位,并且窗口总值加上当前元素

tempSum += nums[j];

// 之前窗口的最大频数和当前窗口频数哪个大

max = Math.max(max, j - i + 1);

}

return max;

}

public static void main(String[] args) {

MaxFrequency maxFrequency = new MaxFrequency();

int[] nums = {1, 4, 8, 13};

System.out.println(maxFrequency.maxFrequency(nums, 5));

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
5%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 12
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值