📜  数组中两个数的最大或

📅  最后修改于: 2022-05-13 01:56:09.123000             🧑  作者: Mango

数组中两个数的最大或

给定一个大小为N的非负整数数组Arr ,任务是找到数组中存在的两个数字之间的最大可能OR

例子:

天真的方法:一个简单的解决方案是生成给定数组的所有对并计算这些对的 OR。最后,返回最大 XOR 值。

时间复杂度: O(N^2)
辅助空间: O(1)

更好的方法:该方法基于以下按位观察:

  • 如果我们设置当前 arr[i] 的所有位,即假设 arr[i]=10 (1010),
  • 我们将其更改为 15 (1111),
  • 并且到目前为止计算的当前最大 OR 大于 15,
  • 那么我们不需要检查 arr[i],因为它不会影响我们的 ans。

这似乎是一个很小的变化,但它会显着减少时间。

下面是上述方法的实现:

C++
// C++ implementation of the above approach
#include 
using namespace std;
 
// Function to return the maximum OR
int maxOR(vector& nums)
{
    int n = nums.size();
    int ans = 0;
    for (int i = 0; i < n; i++) {
        if (ans >= pow(
                       2, floor(log2(nums[i]) + 1))
                       - 1)
            continue;
        for (int j = 0; j < n; j++) {
            if (i != j)
                ans = max(ans,
                          nums[i] | nums[j]);
        }
    }
    return ans;
}
 
// Driver Code
int main()
{
 
    vector arr = { 1, 2, 3, 4, 5, 6, 7 };
    cout << maxOR(arr) << endl;
 
    return 0;
}


Java
// JAVA implementation of the above approach
import java.util.*;
class GFG
{
 
  // Function to return the maximum OR
  public static int maxOR(ArrayList nums)
  {
    int n = nums.size();
    int ans = 0;
    for (int i = 0; i < n; i++) {
      if (ans >= Math.pow(2, Math.floor(
        Math.log(nums.get(i)) + 1)) - 1)
        continue;
      for (int j = 0; j < n; j++) {
        if (i != j)
          ans = Math.max(ans, nums.get(i)
                         | nums.get(j));
      }
    }
    return ans;
  }
 
  // Driver Code
  public static void main(String[] args)
  {
    ArrayList arr = new ArrayList<>(
      Arrays.asList(1, 2, 3, 4, 5, 6, 7));
    System.out.println(maxOR(arr));
  }
}
 
// This code is contributed by Taranpreet


Python3
# Python code for the above approach
# Function to return the maximum OR
from math import pow, floor, log2
 
def maxOR(nums):
    n = len(nums)
    ans = 0
    for i in range(n):
        if (ans >= pow(2, floor(log2(nums[i]) + 1)) - 1):
            continue
        for j in range(n):
            if (i != j):
                ans = max(ans, nums[i] | nums[j])
 
    return ans
 
# Driver Code
arr = [1, 2, 3, 4, 5, 6, 7]
print(maxOR(arr))
 
# This code is contributed by gfgking


C#
// C# implementation of the above approach
using System;
class GFG
{
 
  // Function to return the maximum OR
  public static int maxOR(int[] nums)
  {
    int n = nums.Length;
    int ans = 0;
    for (int i = 0; i < n; i++)
    {
      if (ans >= Math.Pow(2, Math.Floor(
        Math.Log(nums[i]) + 1)) - 1)
        continue;
      for (int j = 0; j < n; j++)
      {
        if (i != j)
          ans = Math.Max(ans, nums[i]
                         | nums[j]);
      }
    }
    return ans;
  }
 
  // Driver Code
  public static void Main()
  {
    int[] arr = { 1, 2, 3, 4, 5, 6, 7 };
    Console.Write(maxOR(arr));
  }
}
 
// This code is contributed by Saurabh Jaiswal


Javascript



输出
7

时间复杂度: O(N^2)
辅助空间: O(1)