015._3sum.md 2.8 KB
Newer Older
K
Keqi Huang 已提交
1
### 15. 3Sum
K
KEQI HUANG 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14

题目:
<https://leetcode.com/problems/3sum/>


难度:

Medium 


第一想法,先把nums排序,用三个loop,无法AC

```
K
KEQI HUANG 已提交
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        n = len(nums)
        res = []
        nums.sort()
        for i in range(n):
            for j in range(i,n):
                for k in range(j,n):
                    if nums[i] + nums[j] + nums[k] == 0 and j != i and k != j and k != i: 
                        curRes = [nums[i],nums[j],nums[k]]
                        if curRes not in res:
                            res.append(curRes)
    
K
KEQI HUANG 已提交
32 33 34 35
        return res
```


K
KEQI HUANG 已提交
36
然后查了一下2sum,用2sum的花样,因为要排除重复以及输出是按照从小到大的输出:但是还是超时
K
KEQI HUANG 已提交
37 38 39


```
K
KEQI HUANG 已提交
40 41
class Solution(object):  # 此法也超时
    def threeSum(self, nums):
K
KEQI HUANG 已提交
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        def twoSum(nums, target):
            """
            :type nums: List[int]
            :type target: int
            :rtype: List[int]
            """
            lookup = {}
            for num in nums:
                if target - num in lookup:
                    if (-target ,target - num, num) not in res:
                        res.append((-target ,target - num, num))
                lookup[num] = target - num

        n = len(nums)
        nums.sort()
        res = []
        for i in range(n):
            twoSum(nums[i+1:], 0-nums[i])
        return [list(i) for i in res]
```


谷歌看别人的代码,思路非常清晰的,运行起来比直接调用 Two Sum快.

清晰的思路:

- 排序
- 固定左边,如果左边重复,继续
- 左右弄边界,去重,针对不同的左右边界情况处理


```python
class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
K
KEQI HUANG 已提交
84
        n, res = len(nums), []
K
KEQI HUANG 已提交
85 86
        nums.sort()
        for i in range(n):
K
KEQI HUANG 已提交
87 88 89
            if i > 0 and nums[i] == nums[i-1]:   # 因为i=0这个元素会直接往下执行
                continue
            l, r = i+1, n-1
K
KEQI HUANG 已提交
90
            while l < r:
K
KEQI HUANG 已提交
91 92 93 94
                tmp = nums[i] + nums[l] + nums[r]
                if tmp == 0:
                    res.append([nums[i], nums[l], nums[r]])
                    l += 1
K
KEQI HUANG 已提交
95
                    r -= 1
K
KEQI HUANG 已提交
96 97 98 99 100
                    while l < r and nums[l] == nums[l-1]: 
                        l += 1
                    while l < r and nums[r] == nums[r+1]: 
                        r -= 1
                elif tmp > 0:
K
KEQI HUANG 已提交
101 102 103
                    r -= 1
                else:
                    l += 1
K
KEQI HUANG 已提交
104
        return res
K
KEQI HUANG 已提交
105 106
```