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

📅  最后修改于: 2023-12-03 14:59:52.383000             🧑  作者: Mango

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

在一些算法和编程练习中,我们会遇到需要计算数组中所有三元组之和小于给定值的问题,这时我们可以使用双指针算法来解决这个问题,时间复杂度为O(n^2)。

算法思路
  1. 数组排序:将数组按从小到大的顺序排序。

  2. 遍历:使用三个指针i、j、k遍历数组,固定指针i,移动指针j和k。

  3. 计算总和:计算三个指针所指元素之和sum。

  4. 判断总和:如果sum小于给定值,则计算符合条件的三元组个数,同时移动指针j;如果sum大于或等于给定值,则移动指针k。

  5. 统计个数:统计所有符合条件的三元组个数。

代码实现

以下是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;
}
注意事项
  1. 数组中的元素可能存在重复,需要去重处理。

  2. 双指针算法的时间复杂度为O(n^2),空间复杂度为O(1)。

  3. 注意指针移动的边界情况。