C++程序 查找和为给定值的三元组
给定一个数组和一个值,在数组中查找是否存在三元组的和等于给定值。如果存在这样的三元组,输出该三元组并返回True,否则返回False。
例子:
输入: array = {12, 3, 4, 1, 6, 9}, sum = 24;
输出: 12, 3, 9
解释: 序列中包含三元组(12,3和9)使得它们的和为24.
输入: array = {1, 2, 3, 4, 5}, sum = 9
输出: 5, 3, 1
解释: 序列中包含三元组(5,3和1)使得它们的和为9.
方法1: 这是对解决上述问题的一种朴素方法。
- 方法: 一个简单的方法是生成所有可能的三元组,并将每个三元组的和与给定值进行比较。以下代码使用三个嵌套循环实现了这种简单的方法。
- 算法:
- 给定长度为n的数组和一个值s
- 创建三个嵌套循环,第一个循环从开始到结尾(循环计数器为i),第二个循环从i+1循环到结尾(循环计数器为j),第三个循环从j+1循环到结尾(循环计数器为k)。
- 这些循环的计数器表示三元组的3个元素的索引。
- 查找第ith、jth和kth元素的总和。如果总和等于给定的和,则输出该三元组并且退出。
- 如果没有三元组,则输出没有三元组存在。
- 实现:
输出
- 时间复杂度和空间复杂度分析:
- 时间复杂度: O(n 3 ). 由于有三层嵌套循环遍历数组,因此时间复杂度是O(n^3)。
- 空间复杂度: O(1). 由于不需要额外的空间。
方法2: 这种方法使用排序来增加代码的效率。
- 方法: 通过对数组进行排序,可以提高算法的效率。这种高效的方法使用了双指针技术。遍历数组,并固定三元组的第一个元素。现在使用双指针算法来查找是否有一对元素的和等于 x – array[i]。双指针算法需要线性时间,因此比嵌套循环好。
- 算法:
- 对给定数组进行排序。
- 循环遍历数组,并固定可能的三元组的第一个元素 arr[i]。
- 然后固定两个指针,一个指向 i + 1,另一个指向 n – 1。查看它们的和,
- 如果和小于所需的和,则增加第一个指针。
- 否则,如果和大,减小末尾指针以减少和。
- 否则,如果两个指针的元素之和等于给定的和,则打印三元组并退出。
- 实现:
输出
- 复杂度分析:
- 时间复杂度: O(N^2)。 只有两个嵌套循环遍历数组,因此时间复杂度为 O(n^2)。双指针算法需要 O(n) 的时间,而第一个元素可以使用另一个嵌套遍历固定。
- 空间复杂度: O(1)。 不需要额外的空间。
方法 3: 这是一种基于哈希的解决方案。
- 方法: 此方法使用额外的空间,但比双指针方法更简单。外部循环从开头到结尾,内部循环从 i+1 到结尾。创建一个哈希表或集合来存储 i+1 到 j-1 之间的元素。因此,如果给定的和为 x,则检查集合中是否有一个数字等于 x – arr[i] – arr[j]。如果是,就打印三元组。
-
算法:
- 从开始到结尾遍历数组(循环计数器 i)。
- 创建哈希表或集合以存储唯一的对。
- 从 i+1 到数组结尾运行另一个循环(循环计数器 j)。
- 如果集合中有一个元素等于 x – arr[i] – arr[j],则打印三元组(arr[i],arr[j],x-arr[i]-arr[j])并退出。
- 将第 j 个元素插入集合中。
- 实现:
输出:
时间复杂度: O(N^2)
空间复杂度: O(N)