LeetCode 15 三数之和
给你一个整数数组 nums ,判断是否存在三元组 |
解题思路
刚拿到这一题,第一个想法是暴力循环,拼出nums[i] + nums[j] + nums[k] = 0
,但是这样最后得出的结果就是超出时间限制。第二个想法是两数之和的延伸,先创建一个Map,将0 - nums[i]
存到map中,然后双循环之后将sum与map中的Key进行比较,发现仍旧还是超出时间限制。
那接下来需要考虑的事就是减少循环的次数,我们知道三数之和要等于0的话,那么说明要么三数都是0,要么就是有正负之分。那么我们先将nums进行排序,然后选择一个位置i作为基准,如果nums[i]大于0的话,那么nums[i]右边的值就不用进行遍历了,因为最小值都已经大于0了。这时我们设置两个指针,一个在最左边,一个在最右边,这样可以根据三数之和与0的大小关系就可以进行对应的调整。
如果nums[i] + nums[L] + nums[R] > 0
的话,说明应该减少一点,那么我们就将R--
,如果小于0,说明应该增加一点,那么我们就将L++
。然后还有一些重复的点,比如nums[i] + nums[L] + nums[R] > 0
且此时如果nums[R] === nums[R--]
那么就可以跳过R,那么一直R--
,直到nums[R] !== nums[R-x]
,L也是一样的道理,且i也是类似的,如果nums[i - 1] === nums[i]
,说明是重复的,可以跳过。
代码
var threeSum = function(nums) { |