跳转至

4042. 有效 K 个不同元素子数组 II 🔒

题目描述

给定一个长度为 n 的整数数组 nums 和一个整数 k

同时给定整数 l0r0,它们定义了第一个查询,以及一个整数 q,表示需要处理的查询总数。

如果一个 子数组 nums[li..ri] 满足以下条件,则称其为 有效 子数组:

  • 它恰好包含 k不同的数字,并且
  • 其中每个不同数字出现的次数都是 偶数

对于查询 0,令 l0 = l0r0 = r0

ansi 表示第 i 个查询的结果,其中:

  • 如果 nums[li..ri] 是有效子数组,则 ansi = 1
  • 否则 ansi = 0

对于每个 i > 0,按照以下方式生成下一个查询:

  • 如果 ansi-1 = 1,则令 gi-1 = li-1 + ri-1;否则令 gi-1 = ri-1 - li-1
  • 计算 li = (li-1 XOR gi-1) % n,以及 ri = (ri-1 XOR gi-1) % n
  • 如果 li > ri,则交换二者。

返回一个布尔数组 ans,其中 ans[i]ansi = 1 时为 true,否则为 false

 

示例 1:

输入: nums = [1,2,2,1], k = 2, l0 = 1, r0 = 2, q = 2

输出: [false,true]

解释:

i [li, ri] 子数组 不同数字 出现次数 有效性判断 ans[i] [li+1, ri+1]
0 [1, 2] [2, 2] {2} → 1 {2:2} false:该子数组包含的不同数字少于 k 个。 ans0 = 0 g0 = 2 - 1 = 1
l1 = (1 XOR 1) % 4 = 0
r1 = (2 XOR 1) % 4 = 3
1 [0, 3] [1, 2, 2, 1] {1,2} → 2 {1:2,2:2} true:该子数组恰好包含 k 个不同数字,并且每个数字出现的次数都是偶数。 ans1 = 1 -

因此,ans = [false, true]

示例 2:

输入: nums = [1,2,3,3,4], k = 1, l0 = 2, r0 = 3, q = 2

输出: [true,false]

解释:

i [li, ri] 子数组 不同数字 出现次数 有效性判断 ans[i] [li+1, ri+1]
0 [2, 3] [3, 3] {3} → 1 {3:2} true:该子数组恰好包含 k 个不同数字,并且每个数字出现的次数都是偶数。 ans0 = 1 g0 = 2 + 3 = 5
l1 = (2 XOR 5) % 5 = 7 % 5 = 2
r1 = (3 XOR 5) % 5 = 6 % 5 = 1

由于 l1 > r1,交换二者,得到 [l1, r1] = [1, 2]
1 [1, 2] [2, 3] {2,3} → 2 {2:1,3:1} false:该子数组包含 2 个不同数字,而不是恰好 k = 1 个。 ans1 = 0 -

因此,ans = [true, false]

 

提示:

  • 2 <= n == nums.length <= 5 × 105
  • 1 <= nums[i] <= 5 × 105
  • 1 <= k <= n
  • 0 <= l0 < r0 <= n - 1
  • 1 <= q <= 5 × 105

解法

方法一

1

1

1

1

评论