题目:给定一个数组nums包含n个整数,,要求编写程序判断数组nums中是否存在三个整数a,b,c,是的a+b+c=0,如果存在的话请找出所有满足条件的三元组。其中三元组不能重复。
栗子:
输入:nums=[2,0,-3,-2,1,-1],输出:[[2,0,-2],[2,-3,1],[0,1,-1]]
输入:nums=[1,2],输出:[]
提示:
0<=nums.length<=3000,
-10^5<=nums[i]<=10^5
请先自行完成下面函数:
int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
}
解释:nums是输入的数组,numsSize是输入数组的长度,returnSize是存放有多少满足条件的三元数组个数的,*returnColumnSizes是存放每个三元数组的长度的数组
答案以及讲解:
这道题其实就是两数之和的延伸,怎么将三数之和与两数之和扯上关系,应该这对大家来说不是很难。题目要求a+b+c=0,转变为两数之和就是,固定一个数a,使得b+c=-a即可。这就变成了两数之和。
还是举个栗子来进一步说明以下。
假设输入nums=[-2,1,2,-1,-1,0]
解题思路:首先nums数组进行排序,然后固定一个数,找其中两个数的和等于他的负数即可。
下面是已经排好序的数组了,固定数-2,然后使用双指针找两数之和是否满足条件
同样的道理,先固定一个数,找两数之和等于其返数。
注意:再往下固定的话,你会发现还是固定-1,这样的话就会重复了,就违背了题目的要求了,那么就到了本体最重要 的去重环节,其实也是很简单的,只不过一开始想到这点就有点想不到。
去重无非就是相同的直接跳过就行了,直接找下一个。
去重代码:
出现之前已经出现过的,就直接跳过,记得前提是i>0,不然第一个就跳过的话,nums[i-1]就越界了。
这里大家还需要考虑一个问题,固定数里面会有重复,比如:
如果里面不去重的话,最后输出的结果还是会有重复的三元数组。
里面去重代码:首先需要满足符合三数之和为0的条件。
对了,还有一点我觉得是非常重要的,会不会有很多同学还处于栈溢出界面呢。
其实可能不是你思路的问题,而是代码有小小的问题出现,我就直接列在下面了。
一定要记得(*returnSize)和(*returnColumnSize)一定要加括号,因为解引用符号级别比较低。
整体代码: