📜  数组中任何对的 OR 和 AND 的最小异或(1)

📅  最后修改于: 2023-12-03 15:10:21.512000             🧑  作者: Mango

数组中任何对的 OR 和 AND 的最小异或

在本题目中,给定一个整数数组nums,你需要计算nums中任何两个元素的OR和AND操作的最小异或值。

具体地,若两个元素分别是a和b,你需要计算(a OR b) XOR (a AND b)的最小值。

解题思路

根据异或的性质,我们可以将(a OR b) XOR (a AND b)转换为(a XOR b) OR (a AND b)。

进一步地,我们可以根据与运算的性质,发现(a XOR b) OR (a AND b) <= a OR b。

因此,我们可以枚举数组中任意两个数,计算它们的 OR 和 AND,然后计算它们的异或值,最终取所有异或值的最小值即可。

代码实现
class Solution:
    def findMinimumXORSum(self, nums: List[int]) -> int:
        n = len(nums)
        ans = float('inf')
        for i in range(n):
            for j in range(i + 1, n):
                val = (nums[i] | nums[j]) ^ (nums[i] & nums[j])
                ans = min(ans, val)
        return ans
class Solution {
public:
    int findMinimumXORSum(vector<int>& nums) {
        int n = nums.size();
        int ans = INT_MAX;
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                int val = (nums[i] | nums[j]) ^ (nums[i] & nums[j]);
                ans = min(ans, val);
            }
        }
        return ans;
    }
};
时间复杂度

本算法的时间复杂度为O(n^2),其中n为数组nums的长度,因为我们需要枚举数组中的任意两个元素求解它们的OR和AND值。

空间复杂度

本算法的空间复杂度为O(1),因为我们只需要记录当前最小的异或值即可,没有使用额外的空间。

参考链接

LeetCode题目链接