当前位置:   article > 正文

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开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/1017558
推荐阅读
相关标签
  

闽ICP备14008679号