sum2, sum3, sum4

sum2问题可以使用dict cache target, 循环两次列表即可算出结果

sum3的问题 先固定住第一个数,然后双指针分别指向第一个数之后和最后一个数.
遍历第二个数,如果和第三个数相加大于target, 则指向最后一个数的指针向前移动(如果最后一个数都小于target的话则表示第二个数不适合),直到找到合适的第三个数(如果没有找到则第二个数的指针会和第三个数的指针重合), 这里还有一个类似于剪纸的小tips: 在第一波移动之后的第三个数的指针暂存起来,之后从这里移动这里移动可以少计算一些本来就大的数.

复杂度为:
(n-2) * n

注意需要过滤掉和前一个数相同的数

class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        nums.sort()
        s_nums = nums
        length = len(s_nums)
        result = []
        for first_pivot in range(length-2):
            first = s_nums[first_pivot]
            if first > 0:
                continue
            if first_pivot > 0 and s_nums[first_pivot] == s_nums[first_pivot-1]:
                continue
            target = 0 - first
            third_pivot = length - 1  # 类似减枝,second增大之后third变小,third之后的数据就不需要继续计算了
            for second_pivot in range(first_pivot+1, length-1):
                if second_pivot > first_pivot + 1 and s_nums[second_pivot - 1] == s_nums[second_pivot]:
                    continue
                while third_pivot > second_pivot and s_nums[second_pivot] + s_nums[third_pivot] > target:
                    third_pivot -= 1
                if second_pivot == third_pivot:
                    break
                if s_nums[second_pivot] + s_nums[third_pivot] == target:
                    print(first_pivot, second_pivot, third_pivot)
                    result.append([s_nums[first_pivot], s_nums[second_pivot], s_nums[third_pivot]])
        return result

sum3的问题可以考虑成多循环一次获得第二个数的sum3

你可能感兴趣的:(sum2, sum3, sum4)