leetcode-python-day10-第18题

========坚持30天刷leetcode=====

题目链接:https://leetcode-cn.com/problems/4sum/

分析:

本题的解题思路与上一题类似,排序,然后先固定几个位置,再首尾各一个变量移动遍历。关键在于:特殊情况的判别,从而降低时间复杂度。

class Solution:
    def fourSum(self, nums, target):
        k=len(nums)
        if k<4: return None           # 特殊情况: 数组小于4
        if k==4 and sum(nums)==target: return [nums]     # 特殊情况: 数组等于4
        nums.sort()
        if nums[0]*4> target:     # 特殊情况: 最小4个数和 大于target
            return []
        if nums[k-1]*4<target:   # 特殊情况: 最大4个数和 小于target
            return [] 
        
        if nums[0]+nums[1]+nums[2]+nums[3] == target:     # 特殊情况: 最小4个数和 等于target
            return [nums[0:4]]
        if nums[k-4]+nums[k-3]+nums[k-2]+nums[k-1]==target:   # 特殊情况: 最大4个数和 等于target
            return [nums[k-4:]]
        
        result=[]                                    
        
        for a in range(k-3):          # 遍历数组
            if a!=0 and nums[a]==nums[a-1]:                            # 特殊情况
                continue
            if nums[a]+nums[a+1]+nums[a+2]+nums[a+3]>target:
                break
            if nums[a]+nums[k-3]+nums[k-2]+nums[k-1]<target:
                continue

            for b in range(a+1,k-2):
                if b!=a+1 and nums[b]==nums[b-1]:                  # 特殊情况
                    continue
                if nums[a]+nums[b]+nums[b+1]+nums[b+2]>target:
                    break
                if nums[a]+nums[b]+nums[k-2]+nums[k-1]<target:
                    continue

                c=b+1                    
                d=k-1                                     
                while c<d:
                    if  nums[a]+nums[b]+nums[c]+nums[d] == target:   
                        result.append([nums[a],nums[b],nums[c],nums[d]])
                        c+=1                                                # 移动c、d
                        while c < d and nums[c-1] == nums[c]: c+= 1
                        d-=1
                        while c < d and nums[d] == nums[d+1]: d-= 1 
                    elif nums[a]+nums[b]+nums[c]+nums[d]<target:          # 移动 c        
                        c+=1
                        while c < d and nums[c-1] == nums[c]: c+= 1    
                    else:                                                # 移动 d     
                        d-=1
                        while c < d and nums[d] == nums[d+1]: d-= 1    
        return result

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值