问题
给定一个由n个整数组成的数组S,是否存在S中的三个数a,b,c使得 a+b+c=0?找出所有的不重复的和为0的三元组。
注意:
1.三元组的整数按照升序排列 a<b<c
2.给出的结果中不能含有相同的三元组
分析:
如果穷举所有这样的三元组,需要三重循环,算法的复杂度肯定是O(n3)。
能不能把算法复杂度降到O(n2)呢?答案是可以的。
首先我们要把数组排序(O(nlgn)),然后固定a,在剩余的数组中看能不能找到a+b+c=0
因为数组是排序的,我们把b指向第一个元素,c指向末尾。
三种情况:
a+b+c=0:找到一组解
a+b+c<0: b向后移一位,增大和
a+b+c>0: c向前移一位,减小和
还要注意的是去掉重复的解,保证a和b都和上次的不同即可。
代码如下:
public class Solution {
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if(num!=null && num.length>=3){
Arrays.sort(num);
int len = num.length;
int lasta=0;
for(int i=0;i<len-2;++i){
int a = num[i];
if(i>0 && a==lasta){
continue;
}
lasta = a;
int s = i+1;
int p = len-1;
int lastb = 0, j=0;
while(s<p){
int b = num[s];
int c = num[p];
int t = a+b+c;
if(t==0){
++s;
--p;
if(j>0 && b==lastb){
continue;
}
++j;
lastb = b;
ArrayList<Integer> tripplet = new ArrayList<Integer>();
tripplet.add(a);
tripplet.add(b);
tripplet.add(c);
result.add(tripplet);
}
else if(t>0){
--p;
}
else{
++s;
}
}
}
}
return result;
}
}
分享到:
相关推荐
这是运用算法降序输出三个数,是一个简单的算法,社和用于初学者在学习c语言的时候学习参考
- 初始化一个变量`closestSum`用于保存与目标值最接近的三数之和,通常可以将其初始化为数组中的前三个元素之和或一个较大的值(例如,数组中最小的三个数之和)。 3. **双指针技术**: - 遍历数组中的每个元素...
请编制程序PROG1.ASM, 其功能是: 内存中连续存放着16个十六位二进制数,在原16个数的第4和第5个数之间插入00FFH,在原16个数的第8和第9个数之间插入FF00H,在原16个数的第12和第13个数之间插入55AAH, 在原16个数的...
在编程领域,尤其是在C#语言中,计算三个数的最小公倍数(LCM,Least Common Multiple)是一项常见的任务,特别是在处理数学问题或算法设计时。最小公倍数是指能够同时整除三个数的最小正整数。在这个项目中,我们将...
通过对这个C++示例代码的分析,我们不仅了解了如何在C++中实现三个数的大小比较和排序,还深入了解了C++中函数定义、条件语句、数据类型和标准输入输出流等核心概念。这些知识点对于初学者来说至关重要,它们构成了...
老师布置的作业,在一个数组中每过三个数字删除一个直到删完
在VB(Visual Basic)编程语言中,对三个数进行排序是一项基本操作,它涉及到数组、条件判断和逻辑控制。在本篇文章中,我们将深入探讨如何使用VB实现对三个数的升序排序,以及背后的原理。 首先,理解排序的含义...
用户输入后,程序会输出这三个数的最大值、最小值和中间值。 6. **异常处理**: 在实际应用中,你可能还需要考虑用户输入非数字的情况。上述代码使用`Int32.Parse`方法尝试将输入转换为整数,如果输入无效,程序会...
整个程序的逻辑是首先提示用户输入三个整数,然后使用冒泡排序算法对这三个数进行排序,最后输出最大的数。这是一种非常基础但实用的排序示例,在教学或练习场景中经常被用到。 综上所述,这段代码展示了C#编程的...
### Java程序:求三个数的最大值 #### 知识点概览 1. **基本语法与数据类型**:包括变量声明、数据类型等。 2. **控制结构**:使用`if...else`语句实现逻辑判断。 3. **标准输入输出**:利用`BufferedReader`读取...
汇编语言求三个数中的最大数和最小数汇编语言求三个数中的最大数和最小数——汇编语言实现jun.asmjun.asmjun.asm汇编语言求三个数中的最大数和最小数——汇编语言实现jun.asmjun.asmjun.asm
汇编中三个数的比较 都相等 显示2 都不相等 显示 0 有两个相等 显示1
这是我做汇编语言的作业的时候编写的比较三个数的大小,然后把最大和最小的数分别输出来,上传上来希望对大家有帮助……
否则交换第一个数和第三个数的位置 mov [si], ax next2: mov ax, [si+2] ; 取第二个数 cmp ax, [si+4] ; 比较第二个数和第三个数 jge next3 ; 如果第二个数大于等于第三个数,则跳转到next3 xchg ax, [si+4] ;...
本节课件主要讲解了如何使用分解质因数法和短除法来求三个数的最小公倍数。下面是相关知识点的总结: 一、分解质因数法 分解质因数法是指将一个数分解成质因数的乘积。例如,14可以分解成2×7,6可以分解成2×3,...
从键盘或者命令行输入3个数,求这三个数的最大值
用来输出三个数中max mid min的数值,本用来大学生C语言作业。
汇编实现比较给定三个数将最大数的存入max单元,可以再debug中调试,查看ds段内容。汇编实现比较给定三个数将最大数的存入max单元,可以再debug中调试,查看ds段内容。
标题中的“vb求最三个数的大数”是指使用VB(Visual Basic)编程语言来编写一个程序,目的是找出三个特定范围内的数字中的最大值。在这个案例中,这三个数字被限制在-10000到10000之间。这是一个基础的算法问题,...
0~9这九个数字横、竖、斜之和为15,Java程序。