lintcode 57.三数之和

class Solution:
    """
    @param numbers: Give an array numbers of n integer
    @return: Find all unique triplets in the array which gives the sum of zero.
    """
    def threeSum(self, numbers):
        # write your code here
        numbers.sort()
        ans=[]
        for i in range(1,len(numbers)):
            left = i-1
            right = i+1
            daan=numbers[i] + numbers[left] + numbers[right]
            while left != 0 and right != len(numbers):
                if numbers[i] + numbers[left] + numbers[right] == 0:
                    ans.append([numbers[left],numbers[i],numbers[right]])
                    left = left - 1
                    right = right + 1
                    if daan < 0:
                        while daan < 0 and right != len(numbers):
                            right = right+1
                            while daan < 0:
                                left = left + 1
        return ans

                            

错误答案稍后再改

class Solution(object):
    '''
        题意:求数列中三个数之和为0的三元组有多少个,需去重
        暴力枚举三个数复杂度为O(N^3)
        先考虑2Sum的做法,假设升序数列a,对于一组解ai,aj, 另一组解ak,al 
        必然满足 il 或 i>k j        指向数之和大于目标值时,右指针向左移使得总和减小,反之左指针向右移
        由此可以用O(N)的复杂度解决2Sum问题,3Sum则枚举第一个数O(N^2)
        使用有序数列的好处是,在枚举和移动指针时值相等的数可以跳过,省去去重部分
    '''
    def threeSum(self, nums):
        nums.sort()
        res = []
        length = len(nums)
        for i in range(0, length - 2):
            if i and nums[i] == nums[i - 1]:
                continue
            target = nums[i] * -1
            left, right = i + 1, length - 1
            while left < right:
                if nums[left] + nums[right] == target:
                    res.append([nums[i], nums[left], nums[right]])
                    right -= 1
                    left += 1
                    while left < right and nums[left] == nums[left - 1]:
                        left += 1
                    while left < right and nums[right] == nums[right + 1]:
                        right -= 1
                elif nums[left] + nums[right] > target:
                    right -= 1
                else:
                    left += 1
        return res


                        
                
                
                
            
            

你可能感兴趣的:(lintcode 57.三数之和)