📅  最后修改于: 2023-12-03 14:59:52.383000             🧑  作者: Mango
在一些算法和编程练习中,我们会遇到需要计算数组中所有三元组之和小于给定值的问题,这时我们可以使用双指针算法来解决这个问题,时间复杂度为O(n^2)。
数组排序:将数组按从小到大的顺序排序。
遍历:使用三个指针i、j、k遍历数组,固定指针i,移动指针j和k。
计算总和:计算三个指针所指元素之和sum。
判断总和:如果sum小于给定值,则计算符合条件的三元组个数,同时移动指针j;如果sum大于或等于给定值,则移动指针k。
统计个数:统计所有符合条件的三元组个数。
以下是C++代码实现:
#include <iostream>
#include <algorithm>
using namespace std;
int threeSum(vector<int>& nums, int target) {
int n = nums.size();
int ans = 0;
sort(nums.begin(), nums.end());
for (int i = 0; i < n - 2; i++) {
int j = i + 1, k = n - 1;
while (j < k) {
int sum = nums[i] + nums[j] + nums[k];
if (sum < target) {
ans += k - j; // 统计符合条件的个数
j++;
} else {
k--;
}
}
}
return ans;
}
int main() {
vector<int> nums { -2, 0, 1, 3 };
int target = 2;
int ans = threeSum(nums, target);
cout << ans << endl;
return 0;
}
数组中的元素可能存在重复,需要去重处理。
双指针算法的时间复杂度为O(n^2),空间复杂度为O(1)。
注意指针移动的边界情况。