LeetCode 18. 四数之和(python)

二次信任 提交于 2020-02-06 00:26:40

题目链接

给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

注意:

答案中不可以包含重复的四元组。

示例:

给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。

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

解题思路:
双层循环+双指针
1.注意去除重复的判定条件的位置
2.在双指针循环内,去除重复在四数之和等于目标值的条件中进行判断,不能在不等于目标值的条件中判断
3.第一重循环,去除重复的条件除了列表第一个数,当前数不等于前一个数
4.第二重循环,去除重复的条件除了第一重循环的下一个数,当前数不等于前一个数

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]: 
        nums.sort()
        length=len(nums)
        res=[]
        for i in range(length):
            if i==0 or nums[i]>nums[i-1]:
                for j in range(i+1,length):
                    if j==i+1 or nums[j]>nums[j-1]:
                        l,r=j+1,length-1
                        while l<r:
                            if nums[i]+nums[j]+nums[l]+nums[r]==target:
                                res.append([nums[i],nums[j],nums[l],nums[r]])
                                l+=1
                                r-=1
                                while l<r and nums[l]==nums[l-1]:
                                    l+=1
                                while l<r and nums[r]==nums[r+1]:
                                    r-=1
                            elif nums[i]+nums[j]+nums[l]+nums[r]<target :
                                l+=1
                            elif nums[i]+nums[j]+nums[l]+nums[r]>target :
                                r-=1
        return res

在这里插入图片描述
进行优化:
适当的时侯跳出循环
在这里插入图片描述
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!