力扣题库刷题笔记18--四数之和

1、题目如下:

2、个人Python代码实现:

        首先看到这题就会想到两种方式,一是四层循环暴力破解,二就是基于前面的三数之和外面加加一层嵌套。

        先看一下暴力破解:

 

         这里可以看到,当数据量足够大时,依旧会超时。但是在机考的时候,使用暴力破解未必不是一种方式,因为每题得分是按照用例通过数计算,也许可以得到该题的大部分分数。同时,实际上这里可以,先对数组nums进行排序,然后再进行循环,可以提升一部分性能,但是这个用例大概率还是不能通过。

3、题解Python代码实现

        诚如上文说的,基于三数之和外加一层嵌套,实际上还是使用的双指针。但是个人并没有实现,浅看了一首题解, 就解出来了:

         如果不好理解,建议先熟悉前面的三数之和和最接近三数之和(写给我自己,如果过段时间写不出来),再来理解本题

        提交代码如下:

class Solution:

    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:

        count = len(nums)           #计算数组nums长度

        res = []                    #输出数组

        nums.sort()                 #数组nums进行升序排序

        for a in range(count - 3):  #a为四个数值中的第一个数

            if a > 0 and nums[a-1] == nums[a]:      #当遍历数组当前数值与前一个数值相同时,进入下一次循环

                continue                            #当连续四个数值之和大于target,代表本次循环往后任意四个数值均大于target

            if nums[a] + nums[a+1] + nums[a+2] + nums[a+3] > target:    

                break                     #当前数值与nums最后三个数值大于target时,意味着可能存在数值和等于target,进入下一次循环

            if nums[a] + nums[count-3] + nums[count-2] + nums[count-1] < target:

                continue                #

            for b in range(a+1,count-2):            #b为四个数值中的第二个数

                if b > a+1 and nums[b-1] == nums[b]:    #去重,原理和第7行一致

                    continue

                if nums[a] + nums[b] + nums[b+1] + nums[b+2] > target:#原理和第9行代码一致,注释在第8行

                    break

                if nums[a] + nums[b] + nums[count-1] + nums[count-2] < target:#原理和第11行代码一致,注释在第8行

                    continue

                c = b + 1                   #c为四个数值中的第三个数,也就是左指针

                d = count - 1               #d为四个数值中的第四个数,也就是右指针

                while c < d:

                    sigma = nums[a] + nums[b] + nums[c] + nums[d]

                    if sigma > target:

                        d -= 1

                    elif sigma < target:

                        c += 1

                    else:

                        if res.count([nums[a], nums[b], nums[c], nums[d]]) == 0:

                            res.append([nums[a], nums[b], nums[c], nums[d]])

                        c += 1

                        d -= 1

        return res

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值