📌  相关文章
📜  打印给定数组中所有可能对的明显绝对差异

📅  最后修改于: 2021-09-07 02:45:06             🧑  作者: Mango

给定一个大小为N的数组 arr[] ,任务是找到给定数组的所有可能对的不同绝对差。

例子:

朴素的方法:解决这个问题最简单的方法是生成给定数组的所有可能对,并将每对的绝对差值插入到一个集合中。最后,打印集合的所有元素。
时间复杂度: 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]是否为真。如果发现为真,则使用 diff = diff |插入 i与所有其他数组元素的绝对差值。 (bset >> i)
  • 最后,迭代范围[0, Max]并检查diff[i]是否为真。如果发现是真的,则打印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)

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live