当前位置: 首页 > 编程笔记 >

用C ++打印给定总和的所有三胞胎

柴英光
2023-03-14
本文向大家介绍用C ++打印给定总和的所有三胞胎,包括了用C ++打印给定总和的所有三胞胎的使用技巧和注意事项,需要的朋友参考一下

在这个问题中,我们得到了一个由唯一整数和和组成的数组。而且我们必须找到可以形成相同总和的三元组。

让我们以一个例子来解决这个问题-

Input : array = {0 , 2 , -1 , 1, -2}
Sum = 1
Output : 1 2 -2
0 2 -1

为了解决这个问题,我们将查找提供总和的所有三元组。一种简单的方法是使用三个循环并找到元素的总和并返回足够的三元组。

示例

#include <iostream>
using namespace std;
void Triplets(int arr[], int n, int sum){
   for (int i = 0; i < n - 2; i++) {
      for (int j = i + 1; j < n - 1; j++) {
         for (int k = j + 1; k < n; k++) {
            if (arr[i] + arr[j] + arr[k] == sum) {
               cout<<arr[i]<<"\t"<<arr[j]<<"\t"<<arr[k]<<endl;
            }
         }
      }
   }
}
//驱动程式码
int main(){
   int arr[] = { 0 , 2 , -1 , 1, -2 };
   int n = sizeof(arr) / sizeof(arr[0]);
   cout<<"The Triplets are : \n";
   Triplets(arr, n, 1);
   return 0;
}

输出结果

三胞胎是-

0 2 -1
2 1 -2

但是这种方法效率不高,因为运行三个循环的时间复杂度为o(n 3)。因此,我们将使用其他技术来有效解决此问题。

一种方法是使用哈希。在这种方法中,我们将找到的每个元素对,使它们彼此互补,即对于值x的元素,我们需要一个元素-x。

这减少了代码的时间复杂度。

示例

#include <bits/stdc++.h>
using namespace std;
void Triplets(int arr[], int n, int sum{
   for (int i = 0; i < n - 1; i++) {
      unordered_set<int> triplet;
      for (int j = i + 1; j < n; j++) {
         int third = sum - (arr[i] + arr[j]);
         if (triplet.find(third) != triplet.end())
            cout<<third<<"\t"<<arr[i]<<"\t"<<arr[j]<<endl;
         else
            triplet.insert(arr[j]);
      }
   }
}
int main(){
   int arr[] = { 0 , 2 , -1 , 1, -2 };
   int n = sizeof(arr) / sizeof(arr[0]);
   cout<<"The Triplets are : \n";
   Triplets(arr, n, 1);
   return 0;
}

输出结果

三胞胎是-

0 2 -1
2 1 -2

通过对数组排序可以使此方法更有效,这将减少代码的空间复杂度。

 类似资料:
  • 我正在练习一些动态规划问题,并试图解决用给定的和打印所有子集的问题。例如:对于和,我应该得到以下结果: 我在不使用表的情况下得到了所需的结果,我使用表来防止重复调用相同的表和求和。但是,当使用表时,我在输出中没有得到。 请帮忙!

  • 本文向大家介绍打印给定字符串的所有排列,包括了打印给定字符串的所有排列的使用技巧和注意事项,需要的朋友参考一下 打印给定字符串的所有排列是回溯问题的一个示例。我们将减小子字符串的大小以解决子问题,然后再次回溯以从该部分获得另一个排列。 例如,如果字符串是ABC,则所有排列将是ABC,ACB,BAC,BCA,CAB,CBA。 该算法的复杂度为O(n!)。这是一个巨大的复杂性。当字符串大小增加时,需要

  • 给定一个由n个整数组成的数组nums和一个目标,求出满足nums[i]+nums[j]+nums[k] 例如,给定nums=[-2,0,1,3],target=2。 返回2。因为有两个和小于2的三胞胎:

  • 以下是一个采访问题。 您将获得一个二叉树(不一定是BST),其中每个节点都包含一个值。设计一个算法来打印所有总计为该值的路径。注意,它可以是树中的任何路径-它不必从根开始。 虽然我能够找到树中从根开始的所有路径都有给定的总和,但对于不是从根开始的路径,我无法这样做。

  • 问题内容: 我正在为Android开发一个数学应用程序。在这些字段之一中,用户可以输入一个整数(无数字且大于0)。这个想法是获得所有可能的和,使之成为整数,而不加倍(在这种情况下为4 + 1 == 1 + 4)。唯一已知的是此int。 例如: 假设用户输入4,我希望该应用返回: 4 3 + 1 2 + 2 2 + 1 + 1 1 + 1 + 1 + 1 显然4 == 4,所以也应该加上。关于我应该

  • 本文向大家介绍C程序打印所有ASCII值。,包括了C程序打印所有ASCII值。的使用技巧和注意事项,需要的朋友参考一下 问题 打印0到255个字符的美国信息交换标准代码(ASCII)值,而无需将该字符初始化为整数类型变量。只需使用格式说明符。 解决方案 在这里,我们正在编写一个程序,仅打印65到122。 如果要查看所有ASCII值,则在for循环中可以编写如下: 然后,它打印从0到255的所有AS

  • 本文向大家介绍使用C ++ STL打印给定范围内的质数,包括了使用C ++ STL打印给定范围内的质数的使用技巧和注意事项,需要的朋友参考一下 它是在给定范围内打印质数的程序。 演算法 示例 输出结果

  • 本文向大家介绍C#打印日志的方法总结,包括了C#打印日志的方法总结的使用技巧和注意事项,需要的朋友参考一下 在我们对程序进行操作过程中,一般都需要有一个操作流程的记录显示。用C#进行编程时可以很容易实现这个功能。本经验提供案例仅供参考 下面小编就来介绍一下如何使用textbox控件实现日志功能。 打开Visual Studio 2010,建立一个新的C#程序。在工具箱中双击【textbox】控件。