给定一个大小为N的数组arr [] ,任务是找到给定数组所有可能对的绝对差值。
例子:
Input: arr[] = { 1, 3, 6 }
Output: 2 3 5
Explanation:
abs(arr[0] – arr[1]) = 2
abs(arr[1] – arr[2]) = 3
abs(arr[0] – arr[2]) = 5
Input: arr[] = { 5, 6, 7, 8, 14, 19, 21, 22 }
Output: 1 2 3 5 6 7 8 9 11 12 13 14 15 16 17
天真的方法:解决此问题的最简单方法是生成给定数组的所有可能对,并将每个对的绝对差插入Set中。最后,打印集合中的所有元素。
时间复杂度: O(N 2 * log(N))
辅助空间: O(N 2 )
方法:可以使用Bitset对上述方法进行优化。请按照以下步骤解决问题:
- 初始化一个比特集,比方说BSET,其中BSET [I]检查,如果i是存在于阵列或不英寸
- 遍历数组arr []并将所有数组元素存储在bset中。
- 初始化一个Bitset,例如diff ,其中diff [i]存储数组中是否存在值等于i的任何对的绝对差。
- 查找数组中最大的元素,例如Max
- 迭代[0,Max]范围。在第i次迭代中,检查bset [i]是否为true。如果确定为真,则使用diff = diff |将i与所有其他数组元素的绝对差值插入。 (bset >> i) 。
- 最后,在[0,Max]范围内进行迭代,并检查diff [i]是否为true。如果发现是真的,则打印i 。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
#define Max 100005
// Function to find all distinct
// absolute difference of all
// possible pairs of the array
void printUniqDif(int n, int a[])
{
// bset[i]: Check if i is present
// in the array or not
bitset bset;
// diff[i]: Check if there exists a
// pair whose absolute difference is i
bitset diff;
// Traverse the array, arr[]
for (int i = 0; i < n; i++) {
// Add in bitset
bset.set(a[i]);
}
// Iterate over the range[0, Max]
for (int i = 0; i <= Max; i++) {
// If i-th bit is set
if (bset[i]) {
// Insert the absolute difference
// of all possible pairs whose
// first element is arr[i]
diff = diff | (bset >> i);
}
}
// Stores count of set bits
int X = bset.count();
// If there is at least one
// duplicate element in arr[]
if (X != n) {
cout << 0 << " ";
}
// Printing the distinct absolute
// differences of all possible pairs
for (int i = 1; i <= Max; i++) {
// If i-th bit is set
if (diff[i]) {
cout << i << " ";
}
}
}
// Driver Code
int main()
{
// Given array
int a[] = { 1, 4, 6 };
// Given size
int n = sizeof(a) / sizeof(a[0]);
// Function Call
printUniqDif(n, a);
return 0;
}
Python3
# Python3 program for the above approach
Max = 100005
# Function to find all distinct
# absolute difference of all
# possible pairs of the array
def printUniqDif(n, a):
# bset[i]: Check if i is present
# in the array or not
bset = [0 for i in range(33)]
# diff[i]: Check if there exists a
# pair whose absolute difference is i
diff = 0
# Traverse the array, arr[]
for i in range(n):
bset[a[i]] = 1
# Iterate over the range[0, Max]
d = 0
for i in range(1,33):
d = d | (bset[i]<> i
# print(bin(diff))
# Stores count of set bits
X, Y = bset.count(1), str(bin(diff)[2:])
# If there is at least one
# duplicate element in arr[]
if (X != n):
print(0, end=" ")
# Printing the distinct absolute
# differences of all possible pairs
for i in range(1, len(Y)):
# If i-th bit is set
if (Y[i] == '1'):
print(i, end = " ")
# Driver Code
if __name__ == '__main__':
# Given array
a = [1, 4, 6]
# Given size
n = len(a)
# Function Call
printUniqDif(n, a)
# This code is contributed by mohit kumar 29
输出:
2 3 5
时间复杂度: O(N + Max),其中Max是数组中的最大元素。
辅助空间: O(Max)