返回介绍

solution / 2800-2899 / 2831.Find the Longest Equal Subarray / README_EN

发布于 2024-06-17 01:02:59 字数 5027 浏览 0 评论 0 收藏 0

2831. Find the Longest Equal Subarray

中文文档

Description

You are given a 0-indexed integer array nums and an integer k.

A subarray is called equal if all of its elements are equal. Note that the empty subarray is an equal subarray.

Return _the length of the longest possible equal subarray after deleting at most _k_ elements from _nums.

A subarray is a contiguous, possibly empty sequence of elements within an array.

 

Example 1:

Input: nums = [1,3,2,3,1,3], k = 3
Output: 3
Explanation: It's optimal to delete the elements at index 2 and index 4.
After deleting them, nums becomes equal to [1, 3, 3, 3].
The longest equal subarray starts at i = 1 and ends at j = 3 with length equal to 3.
It can be proven that no longer equal subarrays can be created.

Example 2:

Input: nums = [1,1,2,2,1,1], k = 2
Output: 4
Explanation: It's optimal to delete the elements at index 2 and index 3.
After deleting them, nums becomes equal to [1, 1, 1, 1].
The array itself is an equal subarray, so the answer is 4.
It can be proven that no longer equal subarrays can be created.

 

Constraints:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= nums.length
  • 0 <= k <= nums.length

Solutions

Solution 1: Hash Table + Two Pointers

We use two pointers to maintain a monotonically variable length window, and a hash table to maintain the number of occurrences of each element in the window.

The number of all elements in the window minus the number of the most frequently occurring element in the window is the number of elements that need to be deleted from the window.

Each time, we add the element pointed to by the right pointer to the window, then update the hash table, and also update the number of the most frequently occurring element in the window. When the number of elements that need to be deleted from the window exceeds $k$, we move the left pointer once, and then update the hash table.

After the traversal, return the number of the most frequently occurring element.

The time complexity is $O(n)$, and the space complexity is $O(n)$. Here, $n$ is the length of the array.

class Solution:
  def longestEqualSubarray(self, nums: List[int], k: int) -> int:
    cnt = Counter()
    l = 0
    mx = 0
    for r, x in enumerate(nums):
      cnt[x] += 1
      mx = max(mx, cnt[x])
      if r - l + 1 - mx > k:
        cnt[nums[l]] -= 1
        l += 1
    return mx
class Solution {
  public int longestEqualSubarray(List<Integer> nums, int k) {
    Map<Integer, Integer> cnt = new HashMap<>();
    int mx = 0, l = 0;
    for (int r = 0; r < nums.size(); ++r) {
      cnt.merge(nums.get(r), 1, Integer::sum);
      mx = Math.max(mx, cnt.get(nums.get(r)));
      if (r - l + 1 - mx > k) {
        cnt.merge(nums.get(l++), -1, Integer::sum);
      }
    }
    return mx;
  }
}
class Solution {
public:
  int longestEqualSubarray(vector<int>& nums, int k) {
    unordered_map<int, int> cnt;
    int mx = 0, l = 0;
    for (int r = 0; r < nums.size(); ++r) {
      mx = max(mx, ++cnt[nums[r]]);
      if (r - l + 1 - mx > k) {
        --cnt[nums[l++]];
      }
    }
    return mx;
  }
};
func longestEqualSubarray(nums []int, k int) int {
  cnt := map[int]int{}
  mx, l := 0, 0
  for r, x := range nums {
    cnt[x]++
    mx = max(mx, cnt[x])
    if r-l+1-mx > k {
      cnt[nums[l]]--
      l++
    }
  }
  return mx
}
function longestEqualSubarray(nums: number[], k: number): number {
  const cnt: Map<number, number> = new Map();
  let mx = 0;
  let l = 0;
  for (let r = 0; r < nums.length; ++r) {
    cnt.set(nums[r], (cnt.get(nums[r]) ?? 0) + 1);
    mx = Math.max(mx, cnt.get(nums[r])!);
    if (r - l + 1 - mx > k) {
      cnt.set(nums[l], cnt.get(nums[l])! - 1);
      ++l;
    }
  }
  return mx;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文