leetcode (力扣) 18. 四数之和 (四指针)

题目在这:https://leetcode-cn.com/problems/4sum/

思路分析:

前两天做了三数之和,还有个最接近的三数之和。今天又来了个四数之和。明天五数之和?后天N数之和?

题目和三数之和的思路是一样的,只不过这次用了四个指针。

四个指针 k–>i–>f–>j 。
使用k指针循环遍历数组, 初始时 k在第一个 i在k后面一个 f在i后面一个 j在最后一个。

  • 如果这四指针相加起来的值等于目标值,则 j往左挪动,f往右挪动。
  • 如果小于,则说明需要加大,f往右挪动
  • 如果大于,则说明需要减小,j往左挪动,
  • 当 f<j 或者f =j时 退出本次循环,然后 i往后挪动一个位置,重置f和j的位置,继续循环。
  • 当 i < j-1时,退出本次循环,k将往后挪,此时重置i的值。

上面的思路一定会看的比较蒙。
大概有这么个思路,去纸上走一遍,立马清晰~~~~~!!!!

完整代码

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        nums.sort()
        print(nums)
        # 四个指针
        res  = []
        if len(nums) < 4:
            return res
        for k in range(len(nums)-3):
            i = k + 1
            j = len(nums)-1
            if k !=0 and nums[k] == nums[k-1]:
                continue
            while i < j-1:
                f = i + 1
                while f < j:
                    s = nums[k] + nums[i] + nums[f] + nums[j]
                    if s  == target:
                        res.append([nums[k] ,nums[i] ,nums[f] ,nums[j]])
                        f +=1
                        j -=1
                        while f < j and nums[f] == nums[f-1]:
                            f +=1
                        while f < j and nums[j] == nums[j+1]:
                            j -=1
                    elif s < target:
                        f +=1
                        while f < j and nums[f] == nums[f-1]:
                            f +=1
                    elif s > target:
                        j -=1
                        while f < j and nums[j] == nums[j+1]:
                            j -=1

                i +=1
                j = len(nums)-1
                while i < j-1 and nums[i] == nums[i-1]:
                    i +=1

        print(res)
        return res```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

深度不学习!!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值