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

  • 输出: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];

// 之前窗口的最大频数和当前窗口频数哪个大
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

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

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

总而言之,面试官问来问去,问的那些Redis知识点也就这么多吧,复习的不够到位,知识点掌握不够熟练,所以面试才会卡壳。将这些Redis面试知识解析以及我整理的一些学习笔记分享出来给大家参考学习

还有更多学习笔记面试资料也分享如下:

都是“Redis惹的祸”,害我差点挂在美团三面,真是“虚惊一场”

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
会卡壳。将这些Redis面试知识解析以及我整理的一些学习笔记分享出来给大家参考学习

还有更多学习笔记面试资料也分享如下:

[外链图片转存中…(img-sprrltAT-1712168558561)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值