当前位置: 首页 > article >正文

[LeetCode-Python版]相向双指针——18. 四数之和

题目

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。

示例 1:
输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:
输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]

提示:

  • 1 <= nums.length <= 200
  • − 1 0 9 < = n u m s [ i ] < = 1 0 9 -10^9 <= nums[i] <= 10^9 109<=nums[i]<=109
  • − 1 0 9 < = t a r g e t < = 1 0 9 -10^9 <= target <= 10^9 109<=target<=109

思路

思路和 15. 三数之和 一样,排序后,枚举 nums[a] 作为第一个数,枚举 nums[b] 作为第二个数,那么问题变成找到另外两个数,使得这四个数的和等于 target,这可以用双指针解决。

时空复杂度

时间复杂度: O ( n 3 ) O(n^3) O(n3)
空间复杂度: O ( 1 ) O(1) O(1)

参考代码

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        nums.sort()
        res = []

        for a in range(len(nums)-3):
            if a 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[-1]+nums[-2]+nums[-3] < target:
                continue
            for b in range(a+1,len(nums)-2):
                if b>a+1 and nums[b]==nums[b-1]:
                    continue
                c = b + 1
                d = len(nums)-1

                if nums[a]+nums[b]+nums[b+1]+nums[b+2] >target:
                    break
                if nums[a]+nums[-1]+nums[-2]+nums[b] < target:
                    continue

                while c<d:
                    s = nums[a]+nums[b]+nums[c]+nums[d]
                    if s>target:
                        d-=1
                    elif s<target:
                        c+=1
                    else:
                        res.append([nums[a],nums[b],nums[c],nums[d]])
                        c+=1
                        while c<d and nums[c]==nums[c-1]: 
                            c+=1
                        d-=1
                        while c<d and nums[d]==nums[d+1]:
                            d-=1
        return res

        
        

http://www.kler.cn/a/451058.html

相关文章:

  • MySQL什么情况下会导致索引失效
  • 关于C语言库的调用
  • 如何编译Opencv +ffmpeg linux 明明安装了ffmpeg但是opencv就是找不到
  • Flutter 基础知识总结
  • vmime.net_4.dll详解:它是什么,有何用途?
  • 鸿蒙学习记录之http网络请求
  • Linux 环境下运行 .NET 8.0 core项目
  • 碰一碰发视频源码搭建的技术拓展,支持OEM
  • 【HarmonyOS 5.0】第十二篇-ArkUI公共属性(一)
  • QT程序发布后,mysql在其它电脑设备无法连接数据库
  • LLaMA-Factory(一)环境配置及包下载
  • ubuntu扩展逻辑卷大小 (安装系统时默认只使用一半)
  • mysql修改表字段 ALTER 命令
  • Xilinx整数的处理计算方法
  • c# 实现一个简单的异常日志记录(异常迭代+分片+定时清理)+AOP Rougamo全局注入
  • 第二节:让电机转起来【51单片机-L298N-步进电机教程】
  • 台球助教平台系统开发APP和小程序信息收藏功能需求解析(第十二章)
  • React:前端开发领域的璀璨之星
  • RabbitMQ 的7种工作模式
  • 内部知识库的未来展望:技术融合与用户体验的双重升级