leetcode 每日一题 15. 三数之和

双指针法

思路:

首先对原数组进行排序,然后从头开始遍历,当遇到nums[i]>0时终止。在遍历过程中,对遍历元素i后面剩余子数组首尾添加指针L和R,通过移动LR找到满足题设条件的[i,L,R]。这里要注意的是,为了避免重复的情况,在遍历过程中,如果遍历的元素nums[i]和它之前元素nums[i-1]相同,则略过此次操作,继续下一个。在找到满足条件的L,R时,如果nums[L+1]==nums[L],则L向右移动到不同的元素位置或者和R位置相同为止,同理如果nums[R-1]==nums[R],则R向左移动到不同的元素位置或者和L位置相同为止。

例如:

[-1,0,1,2,-1,-4]


 

代码:

 

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        length = len(nums)
        if length < 3:
            return []
        result = []
        nums.sort()
        for i in range(length):
            if nums[i]>0:
                return result
            if i > 0 and nums[i] == nums[i-1]:
                continue
            L = i+1
            R = length-1
            while L<R:
                if nums[i]+nums[L]+nums[R] == 0:
                    result.append([nums[i],nums[L],nums[R]])
                    while L<R and nums[L+1]==nums[L]:
                        L += 1
                    while L<R and nums[R-1]==nums[R]:
                        R -= 1
                    L += 1
                    R -= 1
                elif nums[i]+nums[L]+nums[R] > 0:
                    R -= 1
                else:
                    L += 1
        return result

 

 

posted @ 2020-04-27 12:04  nil_f  阅读(145)  评论(0编辑  收藏  举报