LSGO——LeetCode实战(数组系列): 15题 三数之和 (three Sum)

原题

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

解法一:

主要思路是:通过先确定最左边的元素,之后就成为了tow Sum的问题了,关于Tow Sum,我们可以使用双指法去确定元素的位置
注意:

  • 我们这里需要避免重复的元素,所以当碰到重复的元素我们直接跳过就可以了.
  • 第二,因为这里是数组问题,我之前说过,关于数组问题,我可以优先考虑先进行排序预处理,再解决题目。
class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        nums.sort()  #  进行排序
        res, k = [], 0  
        for k in range(len(nums) - 2):  # 开始确定第一个元素位置
            if nums[k] > 0: break  # 1. because of j > i > k.
            if k > 0 and nums[k] == nums[k - 1]: continue  # 2. skip the same `nums[k]`.
            i, j = k + 1, len(nums) - 1
            while i < j:  # 3. double pointer
                s = nums[k] + nums[i] + nums[j]
                if s < 0:
                    i += 1
                    while i < j and nums[i] == nums[i - 1]: i += 1   # 跳过相同的
                elif s > 0:
                    j -= 1
                    while i < j and nums[j] == nums[j + 1]: j -= 1   # 跳过相同的
                else:
                    res.append([nums[k], nums[i], nums[j]])
                    i += 1
                    j -= 1
                    while i < j and nums[i] == nums[i - 1]: i += 1# 跳过相同的
                    while i < j and nums[j] == nums[j + 1]: j -= 1# 跳过相同的
        return res

解法二

将数组分为三块。第一块全为负数,第二块全是0,第三块全为正数。
我尝试将中间一块取最小的非负数的,但是程序实现很复杂。

class Solution(object):
    def function(self,left,right):
        ret =[]
        if len(left) > 1 and len(right)>0:
            for i in range(len(left)-1):
                for j in range(i+1,len(left)):
                    temp =  -1*(left[i]+left[j])
                    if temp in right:
                        min_val = min(left[i],temp,left[j])
                        max_val = max(left[i],temp,left[j])
                        ret.append([min_val,0-min_val-max_val,max_val ])
        return ret
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        nums.sort()
        ret=[]
        left=[]
        right=[]
        mid=[]
        for i in range(len(nums)):
            if nums[i] < 0:
                left.append(nums[i])
            elif nums[i] >0:
                right.append(nums[i])
            else:
                mid.append(nums[i])
        if len(left) > 0 and len(mid) and len(right) > 0:  # 左右两边各自取一个
            if len(left) < len(right):
                temp = left
            else:
                temp  =right
            for i in range(len(temp)):
                if i+1 < len(temp) and temp[i] == temp[i+1]:
                    continue
                if -1*temp[i] in nums:
                    ret.append([min(temp[i],-temp[i]), 0 , max(temp[i],-temp[i])])
        ret = ret + self.function(left,right) + self.function(right,left)
        if len(mid) >2:
            ret.append([0,0,0])
        result =[]
        for item in ret:
            if item not in result:
                result.append(item)
        return result

最后超出时间限制了。

你可能感兴趣的:(LeetCode实战)