LC每日一题|20240523 - 2831. 找出最长等值子数组
给你一个下标从 0 开始的整数数组
nums和一个整数k。如果子数组中所有元素都相等,则认为子数组是一个 等值子数组 。注意,空数组是 等值子数组 。
从
nums中删除最多k个元素后,返回可能的最长等值子数组的长度。子数组 是数组中一个连续且可能为空的元素序列。
提示:
1 <= nums.length <= 10^51 <= nums[i] <= nums.length0 <= k <= nums.length
题目等级:Medium
解题思路
很简单的一道滑窗题~
我们只需要记录一下各个数字出现的位置,然后对每个数字的位置数组滑窗即可~
AC代码
class Solution {
fun longestEqualSubarray(nums: List<Int>, k: Int): Int {
val map = HashMap<Int, ArrayList<Int>>()
for (i in nums.indices) {
map[nums[i]] = (map[nums[i]] ?: arrayListOf()).apply { add(i) }
}
var res = 0
map.forEach {
val p = it.value!!
var l = 0
var r = 0
while (r < p.size) {
while (r < p.size && p[r] - p[l] - r + l <= k) r++
res = Math.max(res, r - l)
l++
}
}
return res
}
}
时间复杂度:O(n)
空间复杂度:O(n)