给定一个由N个整数组成的数组arr [] ,任务是找到该数组的任何排列的第一个元素与其余元素的补码的按位与的最大值,即
A1 &(~A2) & (~A3) & ……& (~An)
例子:
Input: arr[] = {1, 2, 4, 8, 16}
Output: 16
Explanation:
For the permutation {16, 1, 2, 4, 8}, the maximum value of the expression can be obtained.
Input: arr[] = {0, 2, 3, 4, 9, 8}
Output: 4
Explanation:
For the permutation {4, 8, 9, 3, 2, 0}, the maximum value of the expression can be obtained
天真的方法:解决问题的最简单方法是生成给定数组的所有可能排列,并为每个排列找到所需的值,并在其中排列最大值。
时间复杂度: O(N * N!)
辅助空间: O(N)
高效的方法:可以通过以下观察来优化上述方法:
- 表达式A 1 &(〜A 2 )&(〜A 3 )&……&(〜A n )仅取决于A 1的值。
- 因此,要从表达式中获得最大的值,请选择A 1 ,以使其具有尽可能高的置位有效位,而在所有其他数组元素中均未设置该位。
- 由于剩余数组元素的顺序无关紧要,请打印将获得的A 1作为第一个元素的任何排列。
Illustration:
For arr[] = {1, 2, 4, 8, 16}
Binary representation of the array elements:
(16)10 = (10000)2
(8)10 = (01000)2
(4)10 = (00100)2
(2)10 = (00010)2
(1)10 = (00001)2
As it can be seen that 16 has the highest significant set bit which is unset in all other array elements. Therefore, the required permutation of given permutation will contain 16 as the first element.
Hence, the required Bitwise AND is maximum for permutation having 16 as the first element, which is equal to 16 in this case.
下面是上述方法的实现:
C++
// C++ Program to implement
// the above approach
#include
using namespace std;
#define size_int 32
// Function to maximize the value for
// the given function and the array elements
int functionMax(int arr[], int n)
{
// Vector array to maintain which bit is set
// for which integer in the given array by
// saving index of that integer
vector setBit[32];
for (int i = 0; i < n; i++) {
for (int j = 0; j < size_int; j++) {
// Check if j-th bit is set for
// i-th integer
if (arr[i] & (1 << j))
// Push the index of that
// integer in setBit[j]
setBit[j].push_back(i);
}
}
// Find the element having
// highest significant set bit
// unset in other elements
for (int i = size_int; i >= 0; i--) {
if (setBit[i].size() == 1) {
// Place that integer at 0-th index
swap(arr[0], arr[setBit[i][0]]);
break;
}
}
// Store the maximum AND value
int maxAnd = arr[0];
for (int i = 1; i < n; i++) {
maxAnd = maxAnd & (~arr[i]);
}
// Return the answer
return maxAnd;
}
// Driver Code
int main()
{
int arr[] = { 1, 2, 4, 8, 16 };
int n = sizeof arr / sizeof arr[0];
// Function call
cout << functionMax(arr, n);
return 0;
}
Java
// Java Program to implement
// the above approach
import java.util.*;
class GFG{
static final int size_int = 32;
// Function to maximize the value for
// the given function and the array elements
static int functionMax(int arr[], int n)
{
// Vector array to maintain which bit is set
// for which integer in the given array by
// saving index of that integer
Vector []setBit = new Vector[32 + 1];
for (int i = 0; i < setBit.length; i++)
setBit[i] = new Vector();
for (int i = 0; i < n; i++)
{
for (int j = 0; j < size_int; j++)
{
// Check if j-th bit is set for
// i-th integer
if ((arr[i] & (1 << j)) > 0)
// Push the index of that
// integer in setBit[j]
setBit[j].add(i);
}
}
// Find the element having
// highest significant set bit
// unset in other elements
for (int i = size_int; i >= 0; i--)
{
if (setBit[i].size() == 1)
{
// Place that integer at 0-th index
swap(arr, 0, setBit[i].get(0));
break;
}
}
// Store the maximum AND value
int maxAnd = arr[0];
for (int i = 1; i < n; i++)
{
maxAnd = maxAnd & (~arr[i]);
}
// Return the answer
return maxAnd;
}
static int[] swap(int []arr, int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
return arr;
}
// Driver Code
public static void main(String[] args)
{
int arr[] = { 1, 2, 4, 8, 16 };
int n = arr.length;
// Function call
System.out.print(functionMax(arr, n));
}
}
// This code is contributed by PrinciRaj1992
Python3
# Python 3 Program to
# implement the above approach
# Function to maximize the
# value for the given function
# and the array elements
def functionMax(arr, n):
# Vector array to maintain
# which bit is set for which
# integer in the given array by
# saving index of that integer
setBit = [[] for i in range(32)]
for i in range(n):
for j in range(32):
# Check if j-th bit is
# set for i-th integer
if (arr[i] & (1 << j)):
# Push the index of that
# integer in setBit[j]
setBit[j].append(i)
# Find the element having
# highest significant set bit
# unset in other elements
i = 31
while(i >= 0):
if (len(setBit[i]) == 1):
# Place that integer
# at 0-th index
temp = arr[0]
arr[0] = arr[setBit[i][0]]
arr[setBit[i][0]] = temp
break
i -= 1
# Store the maximum
# AND value
maxAnd = arr[0]
for i in range(1, n, 1):
maxAnd = (maxAnd & (~arr[i]))
# Return the answer
return maxAnd
# Driver Code
if __name__ == '__main__':
arr = [1, 2, 4, 8, 16]
n = len(arr)
# Function call
print(functionMax(arr, n))
# This code is contributed by bgangwar59
C#
// C# Program to implement
// the above approach
using System;
using System.Collections.Generic;
class GFG{
static readonly int size_int = 32;
// Function to maximize the value for
// the given function and the array elements
static int functionMax(int []arr, int n)
{
// List array to maintain which bit is set
// for which integer in the given array by
// saving index of that integer
List []setBit = new List[32 + 1];
for (int i = 0; i < setBit.Length; i++)
setBit[i] = new List();
for (int i = 0; i < n; i++)
{
for (int j = 0; j < size_int; j++)
{
// Check if j-th bit is set for
// i-th integer
if ((arr[i] & (1 << j)) > 0)
// Push the index of that
// integer in setBit[j]
setBit[j].Add(i);
}
}
// Find the element having
// highest significant set bit
// unset in other elements
for (int i = size_int; i >= 0; i--)
{
if (setBit[i].Count == 1)
{
// Place that integer at 0-th index
swap(arr, 0, setBit[i][0]);
break;
}
}
// Store the maximum AND value
int maxAnd = arr[0];
for (int i = 1; i < n; i++)
{
maxAnd = maxAnd & (~arr[i]);
}
// Return the answer
return maxAnd;
}
static int[] swap(int []arr, int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
return arr;
}
// Driver Code
public static void Main(String[] args)
{
int []arr = { 1, 2, 4, 8, 16 };
int n = arr.Length;
// Function call
Console.Write(functionMax(arr, n));
}
}
// This code is contributed by Rajput-Ji
16
时间复杂度: O(N * sizeof(int)),其中sizeof(int)为32
辅助空间: O(N)