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

元宝 LeetCode 18. 四数之和 Python3实现

LeetCode 18. 四数之和 — Python3 实现

题目描述

给你一个由
“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”

    示例:

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

    解题思路:排序 + 双指针

    核心思想:四数之和 → 固定两个数 + 两数之和(双指针)

    1. 排序数组
    2. 两层循环固定前两个数
      “i” 和
      “j”
    3. 用双指针
      “left” 和
      “right” 在剩余区间找两数之和
    4. 去重:跳过重复的枚举值

    Python3 代码

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

    for i in range(n - 3): # 去重:跳过相同的 nums[i] if i > 0 and nums[i] == nums[i - 1]: continue # 剪枝:最小的四个数之和 > target,后面更大,直接 break if nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target: break # 剪枝:当前数 + 最大的三个数之和 < target,跳过 if nums[i] + nums[n - 1] + nums[n - 2] + nums[n - 3] < target: continue for j in range(i + 1, n - 2): # 去重:跳过相同的 nums[j] if j > i + 1 and nums[j] == nums[j - 1]: continue # 剪枝:最小的两数之和 > 剩余 target if nums[i] + nums[j] + nums[j + 1] + nums[j + 2] > target: break # 剪枝:当前两数 + 最大两数 < target,跳过 if nums[i] + nums[j] + nums[n - 1] + nums[n - 2] < target: continue # 双指针查找剩余两数 left, right = j + 1, n - 1 while left < right: total = nums[i] + nums[j] + nums[left] + nums[right] if total == target: result.append([nums[i], nums[j], nums[left], nums[right]]) # 去重:移动指针跳过相同值 while left < right and nums[left] == nums[left + 1]: left += 1 while left < right and nums[right] == nums[right - 1]: right -= 1 left += 1 right -= 1 elif total < target: left += 1 else: right -= 1 return result

    图解流程


    “nums = [1,0,-1,0,-2,2]”,
    “target = 0” 为例:

    排序后: [-2, -1, 0, 0, 1, 2]

    i=0, nums[i]=-2:
    j=1, nums[j]=-1:
    双指针 left=2, right=5 → sum = -2-1+0+2 = -1 < 0 → left++
    left=3, right=5 → sum = -2-1+0+2 = -1 < 0 → left++
    left=4, right=5 → sum = -2-1+1+2 = 0 ✓ → [-2,-1,1,2]

    j=2, nums[j]=0:
    left=3, right=5 → sum = -2+0+0+2 = 0 ✓ → [-2,0,0,2]

    i=1, nums[i]=-1:
    j=2, nums[j]=0:
    left=3, right=5 → sum = -1+0+0+2 = 1 > 0 → right–
    left=3, right=4 → sum = -1+0+0+1 = 0 ✓ → [-1,0,0,1]

    结果: [[-2,-1,1,2], [-2,0,0,2], [-1,0,0,1]]

    去重与剪枝说明

    技巧 位置 作用
    去重 i/j 外层循环 避免同一元素重复使用
    去重 left/right 找到解后 避免重复四元组
    剪枝(最小和) 循环开头 提前终止不可能的情况
    剪枝(最大和) 循环开头 跳过太小的情况

    复杂度分析

    指标 值
    时间复杂度 O(n³) — 两层循环 + 双指针
    空间复杂度 O(log n) — 排序递归栈(不计输出)

    对比:两数之和 → 四数之和

    问题 核心方法 时间复杂度
    两数之和 哈希表 O(n)
    三数之和 排序 + 双指针 O(n²)
    四数之和 排序 + 两层循环 + 双指针 O(n³)

    💡 通用套路:
    “k” 数之和可以通过「固定
    “k-2” 个数 + 双指针」将复杂度降到 O(n^(k-1))

    http://www.cnnetsun.cn/news/4331615.html

    相关文章:

  • PyInstaller打包Python脚本全攻略:环境准备、路径兼容与排查指南
  • 分治与随机化:从复杂度分析到排序算法的思维框架
  • 计算机毕业设计之基于HTML5的物流配送系统设计与实现
  • 新手好上手AI界面设计的几个基础步骤
  • 电力巡检缺陷检测数据集工程实践:从7z解压到YOLOv8训练部署全记录
  • Matlab Simulink非线性空气悬架建模与仿真全流程解析
  • Python天气数据爬取与可视化:从API调用到交互式图表实战
  • 基于STM32的数据采集系统设计:从ADC采样到串口协议全解析
  • 基于 Spring Boot 的校园社团管理系统的设计与实现
  • Python 机器学习算法二之逻辑回归的推导及实战
  • 从NumPy到Pandas:一条避开数据分析学习弯路的高效路径
  • 机器学习及其Python实践
  • 安全厂商技术岗笔试复盘:从操作系统到网络的计算机基础考察
  • 偏振成像与MATLAB实现:从三角度图像到DoP/AoP参数提取
  • 论坛社区系统源码实战:商城、知识付费、拓客广告四合一拆解
  • CVPR 2022 | 无需训练的Transformer架构搜索
  • 基于YOLO的交通事故检测系统:从模型训练到部署落地全复盘
  • 书接上回(Convolution)
  • 会议拍摄灯光实战:北京晋商联合大厦项目中的艾蒙拉200X与爱图仕300X应用详解
  • 用Codex和GitHub Actions实现个人网站的自动化部署
  • 【计算机网络 | 网络层9:路由选择算法:距离向量与链路状态算法】
  • 用友秋招笔试真题解析:Java、SQL与ERP业务场景全攻略
  • 数据库里的结构化数据,怎么建立RAG知识库?
  • 基于深度学习的农作物叶片病害识别系统源码与论文实现
  • 用Qwen3微调Embedding模型,提升RAG召回准确率的完整指南
  • Abaqus快速入门:解决许可证冲突与悬臂梁仿真全流程
  • AI购物智能体为何难自动下单?技术拆解与工程实现指南
  • 基于YOLOv8-seg的电力设备缺陷分割改进与部署实战
  • Dubbo由浅入深19
  • 产品二维码溯源管理系统系统设计-一物一码系统 6 大核心模块赋码验真追溯风控分析与会员域设计