LeetCode:三数之和&四数之和

1.方法概述

(1)前期处理
三数之和用三个指针,四数之和用四个指针,最开始都要进行从小到大的排序。

(2)粗处理
编写三数之和的时候第一个指针刚开始指向所给数组的第一个元素;第二个指针记为L指针,初始指向第一个指针所指元素的下一个元素;第三个指针记为R,初始指向所给数组的最后一个元素。当这三个指针所指元素之和小于target时L向右移一位,这样就使三个元素的和变大了;当这三个指针所指元素之和大于target时L向左移一位,这样就使三个元素的和变小了;当三个元素之和等于target时就添加进要返回的数组里面。这里第一个指针要对数组中除最后两个元素的数组中的其他元素进行遍历。

编写四数之和的时候第一个指针刚开始指向所给数组的第一个元素;第二个指针刚开始指向第一个指针所指元素的下一个元素;第三个指针记为L指针,初始指向第二个指针所指元素的下一个元素;第四个指针记为R,初始指向所给数组的最后一个元素。当这四个指针所指元素之和小于target时L向右移一位,这样就使三个元素的和变大了;当这四个指针所指元素之和大于target时L向左移一位,这样就使三个元素的和变小了;当四个元素之和等于target时就添加进要返回的数组里面。这里第一个指针要对除了最后三个元素的数组中的其他元素进行遍历,第二个指针要对除了第一个和最后两个元素的数组中的其他元素进行遍历。

(3)去重处理
仅通过以上两个步骤处理后选出来的元素组合可能会有重复的,所以需要去重处理,但去重处理不是在最后才进行的,而是在上述处理过程中就进行了处理。具体方法总结为:当只有一个箭头变化的时候箭头变化前后所指的元素不能是相同的,当有多个箭头变化的时候,单个箭头变化前后所指的元素可以是相同的。

2.代码

三数求和;

class Solution:
    def threeSum(self, nums):
        n=len(nums)
        res=[]
        if(not nums or n<3):
            return []
        nums.sort()
        res=[]
        for i in range(n):
            if(nums[i]>0):
                return res
            if(i>0 and nums[i]==nums[i-1]):  #去重操作
                continue
            L=i+1
            R=n-1
            while(L<R):
                if(nums[i]+nums[L]+nums[R]==0):
                    res.append([nums[i],nums[L],nums[R]])
                    while(L<R and nums[L]==nums[L+1]):#去重操作
                        L=L+1
                    while(L<R and nums[R]==nums[R-1]):#去重操作
                        R=R-1
                    L=L+1
                    R=R-1
                elif(nums[i]+nums[L]+nums[R]>0):
                    R=R-1
                else:
                    L=L+1
        return res

if __name__ == '__main__':
    solution = Solution()
    nums = [-1,0,1,2,-1,-4]
    result = solution.threeSum(nums)
    print(result)


四数求和:

class Solution:
    def fourSum(self, nums, target):
        n = len(nums)
        nums.sort()
        result = []
        for a in range(0, n - 3):
            if a > 0 and nums[a] == nums[a - 1]:
                continue
            for b in range(a + 1, n - 2):
                if b > a+1 and nums[b] == nums[b - 1]:#去重操作
                    continue
                c = b + 1
                d = n - 1
                while d > c:
                    if (nums[a] + nums[b] + nums[c] + nums[d]) > target:
                        d = d - 1
                    elif nums[a] + nums[b] + nums[c] + nums[d] < target:
                        c = c + 1
                    else:
                        result.append([nums[a], nums[b], nums[c], nums[d]])
                        while c < d and nums[c+1] == nums[c]:#去重操作
                            c = c+1
                        while c < d and nums[d-1] == nums[d]:#去重操作
                            d = d-1
                        c = c+1
        return result


if __name__ == '__main__':
    solution = Solution()
    # nums = [1, 0, -1, 0, -2, 2]
    # nums = [0, 0, 0, 0]
    nums = [-1, 0, 1, 2, -1, -4]

    target = -1
    result = solution.fourSum(nums, target)
    print(result)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

comli_cn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值