LeetCode - 18. 四数之和

@LeetCode刷题


题目

在这里插入图片描述
题目链接:https://leetcode-cn.com/problems/4sum/

一、实现思路

  1. 总体判断:已知数组是否为空,或元素个数小于4,不满足条件,则排序;
        if nums is None or len(nums)<4:
            return []
        nums.sort()
  1. 局部判断:当前元素与上一个元素是否相等
	# i处
	if i>0 and nums[i]==nums[i-1]:
            continue
    # j处
    if j>i+1 and nums[j]==nums[j-1]:
            continue
  1. 局部进一步判断:如果前四个元素相加大于target则后面的值计算均会大于target(数组已排序),则break;如果前面的元素与从后往前的元素相加小于target,说明当前确定的ij对应的值过小,则continue;
			# i处
            if sum(nums[i:i+4])>target:
                break
            if nums[i]+nums[len_-3]+nums[len_-2]+nums[len_-1]<target:
                continue
            # j处
            if nums[i]+nums[j]+nums[j+1]+nums[j+2]>target:
                    break
            if nums[i]+nums[j]+nums[len_-1]+nums[len_-2]<target:
                    continue

二、总体代码

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        if nums is None or len(nums)<4:
            return []
        nums.sort()
        res = []
        len_ = len(nums)

        for i in range(0, len_-3):
            if i>0 and nums[i]==nums[i-1]:
                continue
            if sum(nums[i:i+4])>target:
                break
            if nums[i]+nums[len_-3]+nums[len_-2]+nums[len_-1]<target:
                continue
            for j in range(i+1, len_-2):
                if j>i+1 and nums[j]==nums[j-1]:
                    continue
                if nums[i]+nums[j]+nums[j+1]+nums[j+2]>target:
                    break
                if nums[i]+nums[j]+nums[len_-1]+nums[len_-2]<target:
                    continue
                m, n, tot = j+1, len_-1, nums[i]+nums[j]
                while m<n:
                    if tot+nums[m]+nums[n]==target:
                        res.append([nums[i], nums[j], nums[m], nums[n]])
                        while m<n and nums[m]==nums[m+1]:
                            m += 1
                        while m<n and nums[n]==nums[n-1]:
                            n -= 1
                        m += 1
                        n -= 1
                    elif tot+nums[m]+nums[n]>target:
                        n -= 1
                    else:
                        m += 1

        return res

三、延申

使用Java写的时候,我卡在了List<Integer>的初始化问题,在此记录:

//借鉴于 https://blog.csdn.net/qq_24562495/article/details/84837239
// 用到如下:
List<String> stringList = Arrays.asList("a", "b", "c");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值