📜  C++程序计算总和小于给定值的三元组

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

C++程序计算总和小于给定值的三元组

给定一个不同整数的数组和一个总和值。查找总和小于给定总和值的三元组计数。预期的时间复杂度为 O(n 2 )。
例子:

Input : arr[] = {-2, 0, 1, 3}
        sum = 2.
Output : 2
Explanation :  Below are triplets with sum less than 2
               (-2, 0, 1) and (-2, 0, 3) 

Input : arr[] = {5, 1, 3, 4, 7}
        sum = 12.
Output : 4
Explanation :  Below are triplets with sum less than 12
               (1, 3, 4), (1, 3, 5), (1, 3, 7) and 
               (1, 4, 5)

一个简单的解决方案是运行三个循环以逐个考虑所有三元组。对于每个三元组,如果三元组总和小于给定总和,则比较总和并增加计数。

C++
// A Simple C++ program to count triplets with sum smaller
// than a given value
#include
using namespace std;
  
int countTriplets(int arr[], int n, int sum)
{
    // Initialize result
    int ans = 0;
  
    // Fix the first element as A[i]
    for (int i = 0; i < n-2; i++)
    {
       // Fix the second element as A[j]
       for (int j = i+1; j < n-1; j++)
       {
           // Now look for the third number
           for (int k = j+1; k < n; k++)
               if (arr[i] + arr[j] + arr[k] < sum)
                   ans++;
       }
    }
  
    return ans;
}
  
// Driver program
int main()
{
    int arr[] = {5, 1, 3, 4, 7};
    int n = sizeof arr / sizeof arr[0];
    int sum = 12;
    cout << countTriplets(arr, n, sum) << endl;
    return 0;
}


C++
// C++ program to count triplets with sum smaller than a given value
#include
using namespace std;
  
int countTriplets(int arr[], int n, int sum)
{
    // Sort input array
    sort(arr, arr+n);
  
    // Initialize result
    int ans = 0;
  
    // Every iteration of loop counts triplet with
    // first element as arr[i].
    for (int i = 0; i < n - 2; i++)
    {
        // Initialize other two elements as corner elements
        // of subarray arr[j+1..k]
        int j = i + 1, k = n - 1;
  
        // Use Meet in the Middle concept
        while (j < k)
        {
            // If sum of current triplet is more or equal,
            // move right corner to look for smaller values
            if (arr[i] + arr[j] + arr[k] >= sum)
                k--;
  
            // Else move left corner
            else
            {
                // This is important. For current i and j, there
                // can be total k-j third elements.
                ans += (k - j);
                j++;
            }
        }
    }
    return ans;
}
  
// Driver program
int main()
{
    int arr[] = {5, 1, 3, 4, 7};
    int n = sizeof arr / sizeof arr[0];
    int sum = 12;
    cout << countTriplets(arr, n, sum) << endl;
    return 0;
}


输出:

4

上述解决方案的时间复杂度为 O(n 3 )。一个有效的解决方案可以通过首先对数组进行排序,然后在循环中使用本文的方法 1 来计算 O(n 2 ) 中的三元组。

1) Sort the input array in increasing order.
2) Initialize result as 0.
3) Run a loop from i = 0 to n-2.  An iteration of this loop finds all
   triplets with arr[i] as first element.
     a) Initialize other two elements as corner elements of subarray
        arr[i+1..n-1], i.e., j = i+1 and k = n-1
     b) Move j and k toward each other until they meet, i.e., while (j= sum
                then k--
            // Else for current i and j, there can (k-j) possible third elements
            // that satisfy the constraint.
            (ii) Else Do ans += (k - j) followed by j++ 

下面是上述思想的实现。

C++

// C++ program to count triplets with sum smaller than a given value
#include
using namespace std;
  
int countTriplets(int arr[], int n, int sum)
{
    // Sort input array
    sort(arr, arr+n);
  
    // Initialize result
    int ans = 0;
  
    // Every iteration of loop counts triplet with
    // first element as arr[i].
    for (int i = 0; i < n - 2; i++)
    {
        // Initialize other two elements as corner elements
        // of subarray arr[j+1..k]
        int j = i + 1, k = n - 1;
  
        // Use Meet in the Middle concept
        while (j < k)
        {
            // If sum of current triplet is more or equal,
            // move right corner to look for smaller values
            if (arr[i] + arr[j] + arr[k] >= sum)
                k--;
  
            // Else move left corner
            else
            {
                // This is important. For current i and j, there
                // can be total k-j third elements.
                ans += (k - j);
                j++;
            }
        }
    }
    return ans;
}
  
// Driver program
int main()
{
    int arr[] = {5, 1, 3, 4, 7};
    int n = sizeof arr / sizeof arr[0];
    int sum = 12;
    cout << countTriplets(arr, n, sum) << endl;
    return 0;
}

输出:

4

有关详细信息,请参阅有关总和小于给定值的计数三元组的完整文章!