给定大小为N的数组arr [] ,任务是计算对数(arr [i],arr [j]) ,使得| arr [i] |和| arr [j] |位于| arr [i]-arr [j] |之间和| arr [i] + arr [j] | 。
例子:
Input: arr[] = {1, 3, 5, 7}
Output: 2
Explanation:
Pair (arr[1], arr[2]) (= (3, 5)) lies between |3 – 5| (= 2) and |3 + 5| (= 8).
Pair (arr[2], arr[3]) (= (5, 7)) lies between |5 – 7| (= 2) and |5 + 7| (= 12).
Input: arr[] = {-4, 1, 9, 7, -1, 2, 8}
Output: 9
方法:通过分析以下情况可以解决给定的问题:
- 如果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)也将有效。因此,任务简化为在找到解时仅取X和Y的绝对值,即找到(X,Y),其中| X – Y | ≤X,Y≤X + Y。
请按照以下步骤解决问题:
- 取数组arr []中存在的所有元素的绝对值。
- 对数组arr []排序。
- 将变量初始化为0 ,例如left 。
- 初始化一个变量,例如ans,以存储有效对的数量。
- 使用变量right遍历数组arr []并执行以下步骤:
- 向左递增直到2 * arr [left]小于arr [right] 。
- 将值(i –左)加到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)