📌  相关文章
📜  使得第一数组的元素和更大的不同索引对(i,j)的计数

📅  最后修改于: 2021-04-27 20:57:16             🧑  作者: Mango

给定两个数组a []b [] ,它们的大小均为N。任务是计算不同对的数量,以使(a [i] + a [j])>(b [i] + b [j])满足(j> i)的条件

例子:

天真的方法:
最简单的方法是遍历每个可能的对,如果满足条件,则增加计数。然后,返回计数作为答案。

下面是上述方法的实现:

C++
// C++ program for the above problem
#include 
using namespace std;
 
// function to find the number of
// pairs satisfying the given cond.
int count_pairs(int a[],
                int b[], int N)
{
 
    // variables used for traversal
    int i, j;
 
    // count variable to store the
    // count of possible pairs
    int count = 0;
 
    // Nested loop to find out the
    // possible pairs
    for (i = 0; i < (N - 1); i++) {
        for (j = (i + 1); j < N; j++) {
 
            // Check if the given
            // condition is satisfied
            // or not. If yes then
            // increment the count.
            if ((a[i] + a[j])
                > (b[i] + b[j])) {
 
                count++;
            }
        }
    }
 
    // Return the count value
    return count;
}
 
// Driver Code
int main()
{
 
    // Size of the arrays
    int N = 5;
 
    // Initialise the arrays
    int a[N] = { 1, 2, 3, 4, 5 };
    int b[N] = { 2, 5, 6, 1, 9 };
 
    // function call that returns
    // the count of possible pairs
    cout << count_pairs(a, b, N)
         << endl;
 
    return 0;
}


Java
// Java program for the above problem
class GFG{
 
// function to find the number of
// pairs satisfying the given cond.
static int count_pairs(int []a,
                       int b[], int N)
{
 
    // variables used for traversal
    int i, j;
 
    // count variable to store the
    // count of possible pairs
    int count = 0;
 
    // Nested loop to find out the
    // possible pairs
    for (i = 0; i < (N - 1); i++)
    {
        for (j = (i + 1); j < N; j++)
        {
 
            // Check if the given
            // condition is satisfied
            // or not. If yes then
            // increment the count.
            if ((a[i] + a[j]) > (b[i] + b[j]))
            {
                count++;
            }
        }
    }
 
    // Return the count value
    return count;
}
 
// Driver Code
public static void main(String[] args)
{
 
    // Size of the arrays
    int N = 5;
 
    // Initialise the arrays
    int a[] = new int[]{ 1, 2, 3, 4, 5 };
     
    int b[] = new int[]{ 2, 5, 6, 1, 9 };
 
    // function call that returns
    // the count of possible pairs
    System.out.println(count_pairs(a, b, N));
}
}
 
// This code is contributed by rock_cool


Python3
# Python3 program for the above problem
 
# function to find the number of
# pairs satisfying the given cond.
def count_pairs(a, b, N):
   
    # count variable to store the
    # count of possible pairs
    count = 0;
 
    # Nested loop to find out the
    # possible pairs
    for i in range(0, N - 1):
        for j in range(i + 1, N):
 
            # Check if the given
            # condition is satisfied
            # or not. If yes then
            # increment the count.
            if ((a[i] + a[j]) > (b[i] + b[j])):
                count += 1;
             
    # Return the count value
    return count;
 
# Driver Code
 
# Size of the arrays
N = 5;
 
# Initialise the arrays
a = [ 1, 2, 3, 4, 5 ];
b = [ 2, 5, 6, 1, 9 ];
 
# function call that returns
# the count of possible pairs
print(count_pairs(a, b, N)
 
# This code is contributed by Code_Mech


C#
// C# program for the above problem
using System;
class GFG{
 
// function to find the number of
// pairs satisfying the given cond.
static int count_pairs(int []a,
                       int []b, int N)
{
 
    // variables used for traversal
    int i, j;
 
    // count variable to store the
    // count of possible pairs
    int count = 0;
 
    // Nested loop to find out the
    // possible pairs
    for (i = 0; i < (N - 1); i++)
    {
        for (j = (i + 1); j < N; j++)
        {
 
            // Check if the given
            // condition is satisfied
            // or not. If yes then
            // increment the count.
            if ((a[i] + a[j]) > (b[i] + b[j]))
            {
                count++;
            }
        }
    }
 
    // Return the count value
    return count;
}
 
// Driver Code
public static void Main()
{
 
    // Size of the arrays
    int N = 5;
 
    // Initialise the arrays
    int []a = new int[]{ 1, 2, 3, 4, 5 };
     
    int []b = new int[]{ 2, 5, 6, 1, 9 };
 
    // function call that returns
    // the count of possible pairs
    Console.Write(count_pairs(a, b, N));
}
}
 
// This code is contributed by Code_Mech


Javascript


C++
// C++ program of the above approach
#include 
using namespace std;
 
// Function to find the number
// of pairs.
int numberOfPairs(int* a,
                  int* b, int n)
{
 
    // Array c[] where
    // c[i] = a[i] - b[i]
    int c[n];
 
    for (int i = 0; i < n; i++) {
        c[i] = a[i] - b[i];
    }
 
    // Sort the array c
    sort(c, c + n);
 
    // Initialise answer as 0
    int answer = 0;
 
    // Iterate from index
    // 0 to n - 1
    for (int i = 1; i < n; i++) {
 
        // If c[i] <= 0 then
        // in the sorted array
        // c[i] + c[pos] can never
        // greater than 0
        // where pos < i
        if (c[i] <= 0)
            continue;
 
        // Find the minimum index
        // such that c[i] + c[j] > 0
        // which is equivalent to
        // c[j] >= - c[i] + 1
        int pos = lower_bound(c, c + n,
                              -c[i] + 1)
                  - c;
 
        // Add ( i - pos) to answer
        answer += (i - pos);
    }
 
    // return the answer
    return answer;
}
 
// Driver code
int32_t main()
{
    // Number of elements
    // in a and b
    int n = 5;
 
    // array a
    int a[] = { 1, 2, 3, 4, 5 };
 
    // array b
    int b[] = { 2, 5, 6, 1, 9 };
 
    cout << numberOfPairs(a, b, n)
         << endl;
 
    return 0;
}


Java
// Java program of the above approach
import java.util.*;
 
class GFG{
     
// Function to find the number
// of pairs.
static int numberOfPairs(int[] a,
                         int[] b, int n)
{
     
    // Array c[] where
    // c[i] = a[i] - b[i]
    int c[] = new int[n];
  
    for(int i = 0; i < n; i++)
    {
        c[i] = a[i] - b[i];
    }
  
    // Sort the array c
    Arrays.sort(c);
  
    // Initialise answer as 0
    int answer = 0;
  
    // Iterate from index
    // 0 to n - 1
    for(int i = 1; i < n; i++)
    {
         
        // If c[i] <= 0 then
        // in the sorted array
        // c[i] + c[pos] can never
        // greater than 0
        // where pos < i
        if (c[i] <= 0)
            continue;
             
        // Which is equivalent to
        // c[j] >= - c[i] + 1
        int pos = -1;
        for(int j = 0; j < n; j++)
        {
            if (c[i] + c[j] > 0)
            {
                pos = j;
                break;
            }
        }
         
        // Add (i - pos) to answer
        answer += (i - pos);
    }
     
    // Return the answer
    return answer;
}
  
// Driver code   
public static void main (String[] args)
{
     
    // Number of elements
    // in a and b
    int n = 5;
     
    // array a
    int a[] = { 1, 2, 3, 4, 5 };
     
    // array b
    int b[] = { 2, 5, 6, 1, 9 };
     
    System.out.println(numberOfPairs(a, b, n));
}
}
 
// This code is contributed by offbeat


Python3
# Python3 program of the above approach
from bisect import bisect_left
 
# Function to find the number
# of pairs.
def numberOfPairs(a, b, n):
     
    # Array c[] where
    # c[i] = a[i] - b[i]
    c = [0 for i in range(n)]
 
    for i in range(n):
        c[i] = a[i] - b[i]
 
    # Sort the array c
    c = sorted(c)
 
    # Initialise answer as 0
    answer = 0
 
    # Iterate from index
    # 0 to n - 1
    for i in range(1, n):
 
        # If c[i] <= 0 then in the
        # sorted array c[i] + c[pos]
        # can never greater than 0
        # where pos < i
        if (c[i] <= 0):
            continue
 
        # Find the minimum index
        # such that c[i] + c[j] > 0
        # which is equivalent to
        # c[j] >= - c[i] + 1
        pos = bisect_left(c, -c[i] + 1)
 
        # Add ( i - pos) to answer
        answer += (i - pos)
 
    # Return the answer
    return answer
 
# Driver code
if __name__ == '__main__':
     
    # Number of elements
    # in a and b
    n = 5
 
    # Array a
    a = [ 1, 2, 3, 4, 5 ]
  
    # Array b
    b = [ 2, 5, 6, 1, 9 ]
 
    print(numberOfPairs(a, b, n))
 
# This code is contributed by mohit kumar 29


C#
// C# program of the above approach
using System;
 
class GFG{
     
// Function to find the number
// of pairs.
static int numberOfPairs(int[] a,
                         int[] b, int n)
{
     
    // Array c[] where
    // c[i] = a[i] - b[i]
    int[] c = new int[n];
   
    for(int i = 0; i < n; i++)
    {
        c[i] = a[i] - b[i];
    }
   
    // Sort the array c
    Array.Sort(c);
   
    // Initialise answer as 0
    int answer = 0;
   
    // Iterate from index
    // 0 to n - 1
    for(int i = 1; i < n; i++)
    {
         
        // If c[i] <= 0 then
        // in the sorted array
        // c[i] + c[pos] can never
        // greater than 0
        // where pos < i
        if (c[i] <= 0)
            continue;
              
        // Which is equivalent to
        // c[j] >= - c[i] + 1
        int pos = -1;
        for(int j = 0; j < n; j++)
        {
            if (c[i] + c[j] > 0)
            {
                pos = j;
                break;
            }
        }
          
        // Add (i - pos) to answer
        answer += (i - pos);
    }
     
    // Return the answer
    return answer;
}
 
// Driver Code
static void Main()
{
     
    // Number of elements
    // in a and b
    int n = 5;
      
    // Array a
    int[] a = { 1, 2, 3, 4, 5 };
      
    // Array b
    int[] b = { 2, 5, 6, 1, 9 };
      
    Console.WriteLine(numberOfPairs(a, b, n));
}
}
 
// This code is contributed by divyeshrabadiya07


Javascript


输出:
1

时间复杂度: O(N 2 )
辅助空间: O(1)

高效方法:
请按照以下步骤解决问题:

  • 将给定的不等式重新排列为:
  • 初始化另一个大小为N的数组c [] ,该数组存储a [i]-b [i]的值
  • 对数组c []排序。
  • 答案变量初始化为0。对数组c []进行迭代。
  • 对于数组c []中的每个索引i ,请执行以下操作:
    1. 如果c [i] <= 0 ,则继续。
    2. 如果c [i]> 0 ,则计算最小索引位置,并将该值存储在变量pos中,以使c [pos] + c [i]> 0 。使用C++ STL中的lower_bound函数可以轻松找到pos的值。
    3. 答案中加上(i – pos)

下面是上述方法的实现:

C++

// C++ program of the above approach
#include 
using namespace std;
 
// Function to find the number
// of pairs.
int numberOfPairs(int* a,
                  int* b, int n)
{
 
    // Array c[] where
    // c[i] = a[i] - b[i]
    int c[n];
 
    for (int i = 0; i < n; i++) {
        c[i] = a[i] - b[i];
    }
 
    // Sort the array c
    sort(c, c + n);
 
    // Initialise answer as 0
    int answer = 0;
 
    // Iterate from index
    // 0 to n - 1
    for (int i = 1; i < n; i++) {
 
        // If c[i] <= 0 then
        // in the sorted array
        // c[i] + c[pos] can never
        // greater than 0
        // where pos < i
        if (c[i] <= 0)
            continue;
 
        // Find the minimum index
        // such that c[i] + c[j] > 0
        // which is equivalent to
        // c[j] >= - c[i] + 1
        int pos = lower_bound(c, c + n,
                              -c[i] + 1)
                  - c;
 
        // Add ( i - pos) to answer
        answer += (i - pos);
    }
 
    // return the answer
    return answer;
}
 
// Driver code
int32_t main()
{
    // Number of elements
    // in a and b
    int n = 5;
 
    // array a
    int a[] = { 1, 2, 3, 4, 5 };
 
    // array b
    int b[] = { 2, 5, 6, 1, 9 };
 
    cout << numberOfPairs(a, b, n)
         << endl;
 
    return 0;
}

Java

// Java program of the above approach
import java.util.*;
 
class GFG{
     
// Function to find the number
// of pairs.
static int numberOfPairs(int[] a,
                         int[] b, int n)
{
     
    // Array c[] where
    // c[i] = a[i] - b[i]
    int c[] = new int[n];
  
    for(int i = 0; i < n; i++)
    {
        c[i] = a[i] - b[i];
    }
  
    // Sort the array c
    Arrays.sort(c);
  
    // Initialise answer as 0
    int answer = 0;
  
    // Iterate from index
    // 0 to n - 1
    for(int i = 1; i < n; i++)
    {
         
        // If c[i] <= 0 then
        // in the sorted array
        // c[i] + c[pos] can never
        // greater than 0
        // where pos < i
        if (c[i] <= 0)
            continue;
             
        // Which is equivalent to
        // c[j] >= - c[i] + 1
        int pos = -1;
        for(int j = 0; j < n; j++)
        {
            if (c[i] + c[j] > 0)
            {
                pos = j;
                break;
            }
        }
         
        // Add (i - pos) to answer
        answer += (i - pos);
    }
     
    // Return the answer
    return answer;
}
  
// Driver code   
public static void main (String[] args)
{
     
    // Number of elements
    // in a and b
    int n = 5;
     
    // array a
    int a[] = { 1, 2, 3, 4, 5 };
     
    // array b
    int b[] = { 2, 5, 6, 1, 9 };
     
    System.out.println(numberOfPairs(a, b, n));
}
}
 
// This code is contributed by offbeat

Python3

# Python3 program of the above approach
from bisect import bisect_left
 
# Function to find the number
# of pairs.
def numberOfPairs(a, b, n):
     
    # Array c[] where
    # c[i] = a[i] - b[i]
    c = [0 for i in range(n)]
 
    for i in range(n):
        c[i] = a[i] - b[i]
 
    # Sort the array c
    c = sorted(c)
 
    # Initialise answer as 0
    answer = 0
 
    # Iterate from index
    # 0 to n - 1
    for i in range(1, n):
 
        # If c[i] <= 0 then in the
        # sorted array c[i] + c[pos]
        # can never greater than 0
        # where pos < i
        if (c[i] <= 0):
            continue
 
        # Find the minimum index
        # such that c[i] + c[j] > 0
        # which is equivalent to
        # c[j] >= - c[i] + 1
        pos = bisect_left(c, -c[i] + 1)
 
        # Add ( i - pos) to answer
        answer += (i - pos)
 
    # Return the answer
    return answer
 
# Driver code
if __name__ == '__main__':
     
    # Number of elements
    # in a and b
    n = 5
 
    # Array a
    a = [ 1, 2, 3, 4, 5 ]
  
    # Array b
    b = [ 2, 5, 6, 1, 9 ]
 
    print(numberOfPairs(a, b, n))
 
# This code is contributed by mohit kumar 29

C#

// C# program of the above approach
using System;
 
class GFG{
     
// Function to find the number
// of pairs.
static int numberOfPairs(int[] a,
                         int[] b, int n)
{
     
    // Array c[] where
    // c[i] = a[i] - b[i]
    int[] c = new int[n];
   
    for(int i = 0; i < n; i++)
    {
        c[i] = a[i] - b[i];
    }
   
    // Sort the array c
    Array.Sort(c);
   
    // Initialise answer as 0
    int answer = 0;
   
    // Iterate from index
    // 0 to n - 1
    for(int i = 1; i < n; i++)
    {
         
        // If c[i] <= 0 then
        // in the sorted array
        // c[i] + c[pos] can never
        // greater than 0
        // where pos < i
        if (c[i] <= 0)
            continue;
              
        // Which is equivalent to
        // c[j] >= - c[i] + 1
        int pos = -1;
        for(int j = 0; j < n; j++)
        {
            if (c[i] + c[j] > 0)
            {
                pos = j;
                break;
            }
        }
          
        // Add (i - pos) to answer
        answer += (i - pos);
    }
     
    // Return the answer
    return answer;
}
 
// Driver Code
static void Main()
{
     
    // Number of elements
    // in a and b
    int n = 5;
      
    // Array a
    int[] a = { 1, 2, 3, 4, 5 };
      
    // Array b
    int[] b = { 2, 5, 6, 1, 9 };
      
    Console.WriteLine(numberOfPairs(a, b, n));
}
}
 
// This code is contributed by divyeshrabadiya07

Java脚本


输出:
1

时间复杂度: O(N * log(N)),其中N是数组中元素的数量。
辅助空间: O(N)