📌  相关文章
📜  从数组中计算对 (i, j) 使得 |arr[i]|和 |arr[j]|两者都位于 |arr[i] – arr[j]| 之间和 |arr[i] + arr[j]|

📅  最后修改于: 2021-09-07 05:18:24             🧑  作者: Mango

给定一个大小为N的数组arr[] ,任务是计算对(arr[i], arr[j]) 的数量,使得|arr[i]||arr[j]|位于|arr[i] – arr[j]| 之间|arr[i] + arr[j]| .

例子:

处理方法:通过分析以下情况可以解决给定的问题:

  • 如果 X 为正且 Y 为正:
    • |X – Y|仍然是|X – Y|。
    • |X+Y|仍然是|X + Y|。
  • 如果 X 为负且 Y 为正:
    • |X – Y|变成|-(X + Y)|,|X + Y|。
    • |X+Y|变成|-(X – Y)|,|X – Y|。
  • 如果 X 为正且 Y 为负:
    • |X – Y|变成|X + Y|。
    • |X+Y|变成|X – Y|。
  • 如果 X 为负且 Y 为负:
    • |X – Y|仍然是|X – Y|。
    • |X+Y|仍然是|X + Y|。

从上面的情况可以清楚地看出, |X – Y||X + Y|最多是交换值,这不会改变解决方案。
因此,如果一对对(X, Y)有效那么它也将适用于上述任何情况,例如(-X, Y) 。因此,任务简化为在寻找解决方案时仅取XY 的绝对值,即找到(X, Y),其中|X – Y| ≤ X, Y ≤ X + Y

请按照以下步骤解决问题:

  • 取数组arr[]中所有元素的绝对值
  • 对数组arr[] 进行排序。
  • 初始化一个变量,比如left ,为0。
  • 初始化一个变量,比如ans,来存储有效对的计数。
  • 使用变量遍历数组arr[] ,说right ,并执行以下步骤:
    • 向左递增直到2 *arr[left]小于arr[right]
    • 将值(i – left)添加到ans以包括有效对的数量。
  • 完成以上步骤后,打印ans的值作为结果。

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
 
// Function to find pairs (i, j) such that
// |arr[i]| and |arr[j]| lies in between
// |arr[i] - arr[j]| and |arr[i] + arr[j]|
void findPairs(int arr[], int N)
{
    // Calculate absolute value
    // of all array elements
    for (int i = 0; i < N; i++)
        arr[i] = abs(arr[i]);
 
    // Sort the array
    sort(arr, arr + N);
 
    int left = 0;
 
    // Stores the count of pairs
    int ans = 0;
 
    // Traverse the array
    for (int right = 0; right < N; right++) {
 
        while (2 * arr[left] < arr[right])
 
            // Increment left
            left++;
 
        // Add to the current
        // count of pairs
        ans += (right - left);
    }
 
    // Print the answer
    cout << ans;
}
 
// Driver Code
int main()
{
    int arr[] = { 1, 3, 5, 7 };
    int N = sizeof(arr) / sizeof(arr[0]);
 
    findPairs(arr, N);
 
    return 0;
}


Java
// Java program for the above approach
import java.util.Arrays;
 
class GFG{
 
// Function to find pairs (i, j) such that
// |arr[i]| and |arr[j]| lies in between
// |arr[i] - arr[j]| and |arr[i] + arr[j]|
static void findPairs(int arr[], int N)
{
     
    // Calculate absolute value
    // of all array elements
    for(int i = 0; i < N; i++)
        arr[i] = Math.abs(arr[i]);
 
    // Sort the array
    Arrays.sort(arr);
 
    int left = 0;
 
    // Stores the count of pairs
    int ans = 0;
 
    // Traverse the array
    for(int right = 0; right < N; right++)
    {
        while (2 * arr[left] < arr[right])
 
            // Increment left
            left++;
 
        // Add to the current
        // count of pairs
        ans += (right - left);
    }
 
    // Print the answer
    System.out.print(ans);
}
 
// Driver Code
public static void main(String[] args)
{
    int arr[] = { 1, 3, 5, 7 };
    int N = arr.length;
 
    findPairs(arr, N);
}
}
 
// This code is contributed by AnkThon


Python3
# Python3 program for the above approach
 
# Function to find pairs (i, j) such that
# |arr[i]| and |arr[j]| lies in between
# |arr[i] - arr[j]| and |arr[i] + arr[j]|
def findPairs(arr,  N):
 
    # Calculate absolute value
    # of all array elements
    for i in range(N):
        arr[i] = abs(arr[i])
 
    # Sort the array
    arr.sort()
    left = 0
 
    # Stores the count of pairs
    ans = 0
 
    # Traverse the array
    for right in range(N):
        while (2 * arr[left] < arr[right]):
 
            # Increment left
            left += 1
 
        # Add to the current
        # count of pairs
        ans += (right - left)
 
    # Print the answer
    print(ans)
 
# Driver Code
if __name__ == "__main__":
    arr = [1, 3, 5, 7]
    N = len(arr)
 
    findPairs(arr, N)
 
    # This code is contributed by ukasp.


C#
// C# program for the above approach
using System;
 
class GFG{
 
// Function to find pairs (i, j) such that
// |arr[i]| and |arr[j]| lies in between
// |arr[i] - arr[j]| and |arr[i] + arr[j]|
static void findPairs(int []arr, int N)
{
     
    // Calculate absolute value
    // of all array elements
    for(int i = 0; i < N; i++)
        arr[i] = Math.Abs(arr[i]);
 
    // Sort the array
    Array.Sort(arr);
 
    int left = 0;
 
    // Stores the count of pairs
    int ans = 0;
 
    // Traverse the array
    for(int right = 0; right < N; right++)
    {
        while (2 * arr[left] < arr[right])
 
            // Increment left
            left++;
 
        // Add to the current
        // count of pairs
        ans += (right - left);
    }
 
    // Print the answer
    Console.Write(ans);
}
 
// Driver Code
public static void Main(string[] args)
{
    int []arr = { 1, 3, 5, 7 };
    int N = arr.Length;
 
    findPairs(arr, N);
}
}
 
// This code is contributed by AnkThon


Javascript


输出:
2

时间复杂度: O(N*log N)
辅助空间: O(N)

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