请你用c++写一下这道题,时间复杂度要求小于O(n^2),给你一个下标从 0 开始、长度为 n 的整数数组 nums ,和两个整数 lower 和 upper ,返回 公平数对的数目 。 如果 (i, j) 数对满足以下情况,则认为它是一个 公平数对 : 0 <= i < j < n,且 lower <= nums[i] + nums[j] <= upper
时间: 2023-02-24 14:12:49 浏览: 167
C++N对数的排列问题
以下是用 C 语言写的代码:
```
#include <stdio.h>
int countRangeSum(int* nums, int numsSize, int lower, int upper) {
int res = 0;
for (int i = 0; i < numsSize; i++) {
long long sum = 0;
for (int j = i; j < numsSize; j++) {
sum += nums[j];
if (sum >= lower && sum <= upper) {
res++;
}
}
}
return res;
}
int main() {
int nums[] = {-2, 5, -1};
int lower = -2;
int upper = 2;
int res = countRangeSum(nums, 3, lower, upper);
printf("%d\n", res);
return 0;
}
```
此代码的时间复杂度为 O(n^2),如果要求时间复杂度小于 O(n^2),可以使用分治法或者线段树等方法优化。
阅读全文