📌  相关文章
📜  C ++程序查找总和为给定值的三元组(1)

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

C++程序查找总和为给定值的三元组

在编程中,有很多情况需要查找满足某些条件的数组元素,例如查找总和为给定值的三元组。这个问题可以用C++编程解决。

问题描述

假设有一个整数数组,现在需要找到其中三个数的总和等于给定值。为了简化问题,假设输入的数组中不存在重复数字。

例如,给定数组为:[2, 5, 7, 8, 9, 10, 14],目标总和为:24。那么数组中满足条件的三元组包括:(5, 9, 10)、(7, 8, 9)。

解决方案

为了查找三元组,可以应用著名的“双指针”算法,也称为“对撞指针”算法。该算法的基本思想是,在满足特定条件的条件下,从数组的两端开始搜索,每次移动指针的值以接近目标值。对于查找总和为给定值的三元组,该算法的具体实现如下:

  1. 首先对数组进行排序,以便使用双指针算法。
  2. 遍历数组,将第一个数作为三元组中的第一个元素,将第一个数的下一个数作为左指针,将数组最后一个数作为右指针。
  3. 在左右指针相遇之前,计算当前三个数的和。
  4. 如果三个数的和等于目标总和,则输出这个三元组,并将左右指针各向中间移动一个位置。
  5. 如果三个数的和小于目标总和,则左指针向右移动一个位置。
  6. 如果三个数的和大于目标总和,则右指针向左移动一个位置。
  7. 重复步骤3-6,直到左右指针相遇。
代码实现

下面是使用C++实现查找总和为给定值的三元组的完整代码:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

vector<vector<int>> threeSum(vector<int>& nums, int target) {
    vector<vector<int>> res;
    sort(nums.begin(), nums.end());
    int n = nums.size();
    for (int i = 0; i < n - 2; i++) {
        if (i > 0 && nums[i] == nums[i - 1]) continue; // skip duplicate numbers
        int l = i + 1, r = n - 1;
        while (l < r) {
            int sum = nums[i] + nums[l] + nums[r];
            if (sum == target) {
                res.push_back({nums[i], nums[l], nums[r]});
                while (l < r && nums[l] == nums[l + 1]) l++; // skip duplicate numbers
                while (l < r && nums[r] == nums[r - 1]) r--; // skip duplicate numbers
                l++;
                r--;
            } else if (sum < target) {
                l++;
            } else {
                r--;
            }
        }
    }
    return res;
}

int main() {
    vector<int> nums = {2, 5, 7, 8, 9, 10, 14};
    int target = 24;
    vector<vector<int>> result = threeSum(nums, target);
    cout << "The triplets are: ";
    for (auto triplet : result) {
        cout << "(" << triplet[0] << ", " << triplet[1] << ", " << triplet[2] << ") ";
    }
    cout << endl;
    return 0;
}

代码解释:

  1. 首先,导入必要的头文件和命名空间。
  2. 然后,定义一个函数threeSum(),该函数接受一个整数数组和目标总和作为输入,并返回一个二维向量,其中每个向量表示一个满足条件的三元组。
  3. 在函数threeSum()中,首先将输入的数组排序。
  4. 然后,使用两个for循环遍历数组元素。外部循环遍历数组前n-2个元素,并跳过任何重复数字,以避免输出重复的三元组。内部循环则使用左右指针遍历数组的其他元素。
  5. 使用左右指针计算当前三个元素的总和,并将其与目标总和进行比较。
  6. 如果三个元素的总和等于目标总和,则将它们作为一个三元组添加到结果向量中,并将指针向中间移动。同时,还需要跳过任何重复的元素,以避免输出重复的三元组。
  7. 如果三个元素的总和小于目标总和,则将左指针向右移动,寻找更大的元素。
  8. 如果三个元素的总和大于目标总和,则将右指针向左移动,寻找更小的元素。
  9. 最后,返回结果向量。
运行结果

当运行上面的C++程序时,将得到以下输出结果:

The triplets are: (5, 9, 10) (7, 8, 9)

这表明输入数组中存在两个满足条件的三元组:(5, 9, 10)和(7, 8, 9)。

总结

通过本文,我们已经学习了如何使用C++编程查找总和为给定值的三元组。具体而言,我们学习了使用双指针算法进行查找,并了解了如何在C++中实现它。这种算法在计算机科学中是非常常见的,因此我们希望通过本文,能够帮助你更好地理解和掌握它。