LeetCode第15题3Sum

题目的意思就是说,给一个数组,在这个数组里面找出三个数的和为0的三个数。将这三个数输出。不能有重复的三个数。

刚开始作者道题的时候,想法是找到0或者和0最近的一个数的位置。然后用两个参数往两边移动。但是这样的话总是会出现一些问题,在提交的时候总是有个别的输入跑出的结果不对。也用过三个循环暴力解决,但是时间超时了。

最后想了想,看了网上别人的代码,将自己的刚开始的想法推翻了。重新用另一种思路解决这个问题。

1、将数组排序,利用sort函数

2、利用两层循环遍历,第一层循环实现i从前到倒数第三个数的遍历。第二层循环实现两个参数指针从i以后的数组的两边实现遍历。

3、当nums[i]和nums[lift]和nums[right]的和大于零的时候,right往左移动。当他们的和小于零的时候,lift往右移动。

4、最重要的是,当他们的和为零的时候,将这三个数放入list中。同时要注意那些nums[i]和nums[right]和nums[lift]重复的数字,利用三个while,分别跳过重复的数字。

5、之后再第一个循环的后面不要忘了将i加一。

下面是实现的代码:

class Solution:
    def threeSum(self,nums):
        re = list()
        i = 0
        lift = 0
        right = 0
        nums.sort()
        while i < len(nums)-2:
            lift = i+1
            right = len(nums) - 1
            while lift  < right:
                if nums[i] + nums[right] + nums[lift] >0:
                    right = right - 1
                elif nums[i] + nums[right] + nums[lift] < 0:
                    lift = lift + 1
                else:
                    re.append([nums[lift], nums[i], nums[right]])
                    right = right - 1
                    while right >lift and nums[right]==nums[right+1]:
                        right = right - 1
                    lift = lift + 1
                    while right >lift and nums[lift] == nums[lift-1]:
                        lift = lift + 1
                    while i < len(nums)-2 and nums[i]==nums[i+1]:
                        i = i +1
            i = i + 1
        return re
原文地址:https://www.cnblogs.com/andingding-blog/p/8661718.html