数组中两个数的最大或
给定一个大小为N的非负整数数组Arr ,任务是找到数组中存在的两个数字之间的最大可能OR 。
例子:
Input: Arr = {25, 10, 2, 8, 5, 3}
Output: 29
Input: Arr = {1, 2, 3, 4, 5, 6, 7}
Output: 7
天真的方法:一个简单的解决方案是生成给定数组的所有对并计算这些对的 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)