Medium
题目描述
给定一个整数数组 nums。
异或三元组定义为三个元素的异或运算 nums[i] XOR nums[j] XOR nums[k],其中 i <= j <= k。
返回所有可能三元组 (i, j, k) 的唯一异或三元组值的数量。
示例 1:
输入:nums = [1,3]
输出:2
解释:
可能的异或三元组值有:
(0, 0, 0) → 1 XOR 1 XOR 1 = 1
(0, 0, 1) → 1 XOR 1 XOR 3 = 3
(0, 1, 1) → 1 XOR 3 XOR 3 = 1
(1, 1, 1) → 3 XOR 3 XOR 3 = 3
唯一的异或值是 {1, 3}。因此,输出是 2。
示例 2:
输入:nums = [6,7,8,9]
输出:4
解释:
可能的异或三元组值是 {6, 7, 8, 9}。因此,输出是 4。
约束条件:
1 <= nums.length <= 15001 <= nums[i] <= 1500
提示:
- 任何三元组可达到的最大异或值是多少?
- 对于每个索引
i,考虑所有索引对(j, k)使得i <= j <= k。对于每一对,计算三元组异或为nums[i] XOR nums[j] XOR nums[k]。 - 可以通过预计算或重用中间异或结果来优化计算。
解题思路
这道题需要计算所有满足 i <= j <= k 的三元组的异或值,并统计唯一值的数量。
基础思路: 最直接的方法是三重循环枚举所有满足条件的三元组,计算异或值并用集合去重。时间复杂度为 O(n³)。
优化思路:
可以固定第一个元素 nums[i],然后枚举后续的所有二元组 (j, k),利用异或的性质进行优化:
- 固定
i,对于j >= i和k >= j,计算nums[i] XOR nums[j] XOR nums[k] - 可以先计算
nums[j] XOR nums[k],再与nums[i]异或
进一步优化: 预计算所有可能的二元组异或值,然后对每个第一个元素进行异或操作。
由于数组长度最大为1500,三重循环的复杂度在可接受范围内,我们采用最直观的解法确保正确性。使用哈希集合存储所有唯一的异或值。
代码实现
class Solution {
public:
int uniqueXorTriplets(vector<int>& nums) {
unordered_set<int> uniqueXors;
int n = nums.size();
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
for (int k = j; k < n; k++) {
int xorValue = nums[i] ^ nums[j] ^ nums[k];
uniqueXors.insert(xorValue);
}
}
}
return uniqueXors.size();
}
};
class Solution:
def uniqueXorTriplets(self, nums: List[int]) -> int:
unique_xors = set()
n = len(nums)
for i in range(n):
for j in range(i, n):
for k in range(j, n):
xor_value = nums[i] ^ nums[j] ^ nums[k]
unique_xors.add(xor_value)
return len(unique_xors)
public class Solution {
public int UniqueXorTriplets(int[] nums) {
HashSet<int> uniqueXors = new HashSet<int>();
int n = nums.Length;
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
for (int k = j; k < n; k++) {
int xorValue = nums[i] ^ nums[j] ^ nums[k];
uniqueXors.Add(xorValue);
}
}
}
return uniqueXors.Count;
}
}
var uniqueXorTriplets = function(nums) {
const uniqueXors = new Set();
const n = nums.length;
for (let i = 0; i < n; i++) {
for (let j = i; j < n; j++) {
for (let k = j; k < n; k++) {
const xorValue = nums[i] ^ nums[j] ^ nums[k];
uniqueXors.add(xorValue);
}
}
}
return uniqueXors.size;
};
复杂度分析
| 复杂度类型 | 分析 |
|---|---|
| 时间复杂度 | O(n³) - 三重循环遍历所有满足条件的三元组 |
| 空间复杂度 | O(min(n³, max_value)) - 哈希集合存储唯一异或值,最多有n³个三元组,但异或值受限于数组元素的最大值 |