赞
踩
示例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开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。