计算总和小于 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