15. 三数之和

作者: 不爱去冒险的少年y | 来源:发表于2018-05-16 10:37 被阅读0次

    15. 三数之和

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

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

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

    满足要求的三元组集合为:

    [

      [-1, 0, 1],

      [-1, -1, 2]

    ]

    class Solution:

        def threeSum(self, nums):

            """

            :type nums: List[int]

            :rtype: List[List[int]]

            """

            num_dict = self.list2dict(nums)

            num_negative = num_dict['num_negative']

            num_positive = num_dict['num_positive']

            num_results = []

            for i in range(len(num_negative)):

                for j in range(len(num_positive)):

                    list_result = []

                    list_result.append(num_negative[i])

                    list_result.append(num_positive[j])

                    sum = num_negative[i] + num_positive[j]

                    sum = -sum

                    if sum<0:

                        if sum < num_negative[i]:

                            break

                    else:

                        if sum < num_positive[j]:

                            continue

                    if num_negative[i] == num_positive[j] == 0:

                        if num_dict[num_negative[i]]>=3:

                            list_result.append(0)

                    elif sum in num_dict:

                        if sum == num_negative[i] or sum == num_positive[j]:

                            if num_dict[sum]>1:

                                list_result.append(sum)

                            else:

                                continue

                        else:

                            list_result.append(sum)

                    if len(list_result) == 3:

                        num_results.append(list_result)

            return num_results

        def list2dict(self, nums):

            '''

            数组转换成字典

            :param nums:

            :return:

            '''

            num_dict = {}

            num_positive = []

            num_negative = []

            for i in range(len(nums)):

                if nums[i] in num_dict:

                    num_dict[nums[i]]+=1

                else:

                    num_dict[nums[i]]=1

                    if nums[i]<=0:

                        num_negative.append(nums[i])

                    if nums[i]>=0:

                        num_positive .append(nums[i])

            num_dict['num_positive'] = self.paixu(num_positive)

            num_dict['num_negative'] = self.paixu(num_negative)

            return num_dict

        def paixu(self, nums):

            for i in range(len(nums)):

                for j in range(len(nums)-i-1):

                    if nums[j] >nums[j+1]:

                        n = nums[j]

                        nums[j] = nums[j+1]

                        nums[j+1] = n

            y=1

            while y < len(nums): #去重

                if nums[y] == nums[y-1]:

                    nums.pop(y)

                    continue

                else:

                    y+=1

            return nums

    相关文章

      网友评论

        本文标题:15. 三数之和

        本文链接:https://www.haomeiwen.com/subject/xvxpdftx.html