[算法练习]3 三数之和
一、题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
示例 1:
复制代码
二、题解:
1.解读
已知目标值,遍历数据找出两个数,且和为目标值。首先想到的就是暴力求解,也可以排序后二分,更好的方法也可以用 Hash 求解。
2.思路 1
在思考两数之和解决方法的时候,我们使用了两层循环把所有的结果给求出来,相信大家很快就想到三数之和我就用三个循环,很棒,思路是一样,只是之前的 a+b=0,现在的 b=c+d 了。好了代码呈上。
3.思路 2
第一步将整个数组排序
从左侧开始,选定第一个数为定值比如下面的-4,然后左右指针分别指向对应位置如下图,是不是很像快排。
定义的左右和定值相加
如果等于 0,记录下三个值
如果小于 0,左指针右移动
如果大于 0,右指针左移
然后定值右移,重复这个步骤
4.实现
在前面的两数之和的基础上,将目标值移动到左边等于 0 就转换为了上一次的练习题。二第二种方式采用先排队,然后两边夹击的方式求解。
三、代码:
复制代码
复制代码
时间复杂度:O(n ^ 2)
空间复杂度:O(n)
四、总结
文中使用了两种方式来解决这个问题,第一种为复杂度较高的暴力解答,第二种使用了类似快排思想的双指针法,后面还会有更多关于双指针的用法,敬请期待。至此,想想有学会点什么了?
评论