📌  相关文章
📜  计算总和小于 x 的已排序数组中的对

📅  最后修改于: 2022-05-13 01:57:51.892000             🧑  作者: Mango

计算总和小于 x 的已排序数组中的对

给定一个排序的整数数组和数字 x,任务是计算数组中总和小于 x 的对。
例子:

Input  : arr[] = {1, 3, 7, 9, 10, 11}
         x = 7
Output : 1
There is only one pair (1, 3)

Input  : arr[] = {1, 2, 3, 4, 5, 6, 7, 8}
         x = 7
Output : 6
Pairs are (1, 2), (1, 3), (1, 4), (1, 5)
          (2, 3) and (2, 4)  

这个问题的一个简单解决方案是运行两个循环来生成所有对并一个接一个地检查当前对的总和是否小于 x。
这个问题的一个有效解决方案是在 l 和 r 变量中获取索引的初始值和最后一个值。

1) Initialize two variables l and r to find the candidate 
   elements in the sorted array.
       (a) l = 0
       (b) r = n - 1
2) Initialize : result = 0
2) Loop while l < r.

    // If current left and current
    // right have sum smaller than x,
    // the all elements from l+1 to r
    // form a pair with current
    (a) If (arr[l] + arr[r] < x)  
          result = result + (r - l)      
   
    (b) Else
            r--;
       
3) Return result

下面是上述步骤的实现。

C++
// C++ program to count pairs in an array
// whose sum is less than given number x
#include
using namespace std;
 
// Function to count pairs in array
// with sum less than x.
int findPairs(int arr[],int n,int x)
{
    int l = 0, r = n-1;
    int result = 0;
 
    while (l < r)
    {
        // If current left and current
        // right have sum smaller than x,
        // the all elements from l+1 to r
        // form a pair with current l.
        if (arr[l] + arr[r] < x)
        {
            result += (r - l);
            l++;
        }
 
        // Move to smaller value
        else
            r--;
    }
 
    return result;
}
 
// Driven code
int main()
{
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};
    int n = sizeof(arr)/sizeof(int);
    int x = 7;
    cout << findPairs(arr, n, x);
    return 0;
}


Java
// Java program to count pairs in an array
// whose sum is less than given number x
class GFG {
     
    // Function to count pairs in array
    // with sum less than x.
    static int findPairs(int arr[], int n, int x)
    {
         
        int l = 0, r = n - 1;
        int result = 0;
     
        while (l < r)
        {
             
            // If current left and current
            // right have sum smaller than x,
            // the all elements from l+1 to r
            // form a pair with current l.
            if (arr[l] + arr[r] < x)
            {
                result += (r - l);
                l++;
            }
     
            // Move to smaller value
            else
                r--;
        }
     
        return result;
    }
     
    // Driver method
    public static void main(String[] args)
    {
         
        int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};
        int n = arr.length;
        int x = 7;
         
        System.out.print(findPairs(arr, n, x));
    }
}
 
// This code is contributed by Anant Agarwal.


Python3
# Python3 program to count pairs
# in an array whose sum is less
# than given number x
 
# Function to count pairs in array
# with sum less than x.
def findPairs(arr, n, x):
 
    l = 0; r = n-1
    result = 0
 
    while (l < r):
     
        # If current left and current
        # right have sum smaller than x,
        # the all elements from l+1 to r
        # form a pair with current l.
        if (arr[l] + arr[r] < x):
         
            result += (r - l)
            l += 1
         
 
        # Move to smaller value
        else:
            r -= 1
 
    return result
     
# Driver Code
arr = [1, 2, 3, 4, 5, 6, 7, 8]
n = len(arr)
x = 7
print(findPairs(arr, n, x))
 
# This code is contributed by Anant Agarwal.


C#
// C# program to count pairs in
// an array whose sum is less
// than given number x
using System;
 
class GFG {
     
    // Function to count pairs in array
    // with sum less than x.
    static int findPairs(int []arr, int n,
                         int x)
    {
         
        int l = 0, r = n - 1;
        int result = 0;
     
        while (l < r)
        {
             
            // If current left and current
            // right have sum smaller than x,
            // the all elements from l+1 to r
            // form a pair with current l.
            if (arr[l] + arr[r] < x)
            {
                result += (r - l);
                l++;
            }
     
            // Move to smaller value
            else
                r--;
        }
     
        return result;
    }
     
    // Driver code
    public static void Main(String[] args)
    {
         
        int []arr = {1, 2, 3, 4, 5, 6, 7, 8};
        int n = arr.Length;
        int x = 7;
         
        Console.Write(findPairs(arr, n, x));
    }
}
 
// This code is contributed by parashar...


PHP


Javascript


C++
#include 
using namespace std;
#include 
#include 
using namespace __gnu_pbds;
#define ordered_set                                        \
    tree, null_type, less >, \
         rb_tree_tag, tree_order_statistics_node_update>
 
int countPair(vector v, int sum)
{
    int ans = 0;
 
    ordered_set st;
    int y = 0;
    for (auto i = v.rbegin(); i != v.rend(); i++) {
        int num = *i;
        if (st.empty())
            st.insert({ num, y });
 
        else {
            int left = sum - num;
            ans += st.order_of_key({ left, -1 });
            st.insert({ num, y });
        }
        y++;
    }
 
    return ans;
}
int main()
{
 
    int n;
    cin >> n;
 
    vector v{ 1, 2, 3, 4, 5, 6, 7, 8 };
 
    int sum = 7;
 
    cout << countPair(v, sum);
 
    return 0;
}


输出
6

时间复杂度:O(n)
空间复杂度:O(1)

使用基于策略的数据结构:

它也适用于未排序的数组

C++

#include 
using namespace std;
#include 
#include 
using namespace __gnu_pbds;
#define ordered_set                                        \
    tree, null_type, less >, \
         rb_tree_tag, tree_order_statistics_node_update>
 
int countPair(vector v, int sum)
{
    int ans = 0;
 
    ordered_set st;
    int y = 0;
    for (auto i = v.rbegin(); i != v.rend(); i++) {
        int num = *i;
        if (st.empty())
            st.insert({ num, y });
 
        else {
            int left = sum - num;
            ans += st.order_of_key({ left, -1 });
            st.insert({ num, y });
        }
        y++;
    }
 
    return ans;
}
int main()
{
 
    int n;
    cin >> n;
 
    vector v{ 1, 2, 3, 4, 5, 6, 7, 8 };
 
    int sum = 7;
 
    cout << countPair(v, sum);
 
    return 0;
}
输出
6