LC每日一题|20240523 - 2831. 找出最长等值子数组

151 阅读1分钟

LC每日一题|20240523 - 2831. 找出最长等值子数组

给你一个下标从 0 开始的整数数组 nums 和一个整数 k

如果子数组中所有元素都相等,则认为子数组是一个 等值子数组 。注意,空数组是 等值子数组

nums 中删除最多 k 个元素后,返回可能的最长等值子数组的长度。

子数组 是数组中一个连续且可能为空的元素序列。

提示:

  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= nums.length
  • 0 <= 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)