15. 3Sum题解

https://leetcode.com/problems/3sum/

题解

此题解法我参考了https://leetcode.com/problems/3sum/discuss/7402/Share-my-AC-C%2B%2B-solution-around-50ms-O(N*N)-with-explanation-and-comments,感觉比较容易理解。

即遍历每个数,寻找另外两个数满足条件,使用类似快速排序那样的方法。

需要注意的是对同一基准数,找到一组解后,跳过重复元素:

                    front += 1
                    back -= 1
                    while(front < back and nums[front] == nums[front-1]):
                        front += 1
                    while(front < back and nums[back] == nums[back+1]):
                        back -= 1

对两个基准数相等,也要跳过:

            if i > 0 and nums[i] == nums[i-1]:
                continue

AC代码

class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        res = []
        nums.sort()
        for i in range(len(nums)):
            if i > 0 and nums[i] == nums[i-1]:
                continue
            target = -1 * nums[i]
            front = i + 1
            back = len(nums) - 1
            while(front < back):
                if nums[front] + nums[back] < target:
                    front += 1
                elif nums[front] + nums[back] > target:
                    back -= 1
                else:
                    # res.append([i, front, back])
                    res.append([nums[i], nums[front], nums[back]])
                    front += 1
                    back -= 1
                    while(front < back and nums[front] == nums[front-1]):
                        front += 1
                    while(front < back and nums[back] == nums[back+1]):
                        back -= 1
        return res

猜你喜欢

转载自blog.csdn.net/scut_salmon/article/details/89300707