leetcode--三数之和(C语言以及栈溢出问题的解决)

题目:给定一个数组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)一定要加括号,因为解引用符号级别比较低。

整体代码:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值