LeetCode 每日一题 #18:四数之和|Python 排序 + 双重循环 + 双指针

几年前我准备求职时,也曾一头扎进 LeetCode 的题海。从最初的“看题懵圈”到后来能在面试中从容写出最优解,每天坚持刷一道题成了我提升算法能力最有效的方式。那段经历不仅帮我顺利拿到心仪 offer,更让我养成了系统思考和高效编码的习惯。

如今工作稳定了,终于有时间把当年的刷题笔记重新整理、优化,并用 Python 语言 逐题讲解清楚。希望能帮助正在准备面试、转行或想夯实基础的你——少走弯路,高效进步

关键词:双指针、排序、四数之和、去重、剪枝优化
难度:中等
推荐指数:⭐⭐⭐⭐☆(高频变种题,考察代码鲁棒性)

题目描述

给你一个由 n 个整数组成的数组 nums 和一个目标值 target
请你找出所有不重复的四元组 [a, b, c, d],使得 a + b + c + d == target

答案中不能包含重复的四元组。

示例

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

约束条件

  • 1 <= nums.length <= 200
  • -10⁹ <= nums[i] <= 10⁹
  • -10⁹ <= target <= 10⁹

解题思路

本题是 第 15 题《三数之和》的直接推广。核心思想不变:

排序 + 固定前两个数 + 双指针处理后两个数

但由于维度增加,去重和剪枝逻辑更复杂,需格外小心。

整体框架:

  1. 排序数组 → 支持双指针与去重
  2. 外层两重循环
    • i:第一个数(范围 [0, n-4]
    • j:第二个数(范围 [i+1, n-3]
  3. 内层双指针
    • left = j+1, right = n-1
    • 寻找 nums[left] + nums[right] == target - nums[i] - nums[j]
  4. 关键挑战
    • 去重ijleftright 四处均需跳过重复值
    • 剪枝:提前终止不可能的分支,避免超时

Python 代码实现

解法:排序 + 双重循环 + 双指针(标准解法)

classSolution:deffourSum(self, nums: List[int], target:int)-> List[List[int]]: nums.sort() n =len(nums) result =[]for i inrange(n -3):# 去重 iif i >0and nums[i]== nums[i -1]:continue# 剪枝1:最小四数和 > target → 后续无解if nums[i]+ nums[i +1]+ nums[i +2]+ nums[i +3]> target:break# 剪枝2:最大四数和 < target → 当前 i 无解if nums[i]+ nums[n -3]+ nums[n -2]+ nums[n -1]< target:continuefor j inrange(i +1, n -2):# 去重 jif j > i +1and nums[j]== nums[j -1]:continue# 剪枝3:当前最小四数和 > targetif nums[i]+ nums[j]+ nums[j +1]+ nums[j +2]> target:break# 剪枝4:当前最大四数和 < targetif nums[i]+ nums[j]+ nums[n -2]+ nums[n -1]< target:continue left, right = j +1, n -1while left < right: s = nums[i]+ nums[j]+ nums[left]+ nums[right]if s == target: result.append([nums[i], nums[j], nums[left], nums[right]])# 去重 left 和 rightwhile left < right and nums[left]== nums[left +1]: left +=1while left < right and nums[right]== nums[right -1]: right -=1 left +=1 right -=1elif s < target: left +=1else: right -=1return result 

🔍 关键逻辑详解

去重策略
  • i 去重if i > 0 and nums[i] == nums[i-1]: continue
    → 跳过与前一个相同的起始值
  • j 去重if j > i+1 and nums[j] == nums[j-1]: continue
    → 注意条件是 j > i+1,而非 j > 0,确保只跳过本轮内的重复
为什么 j 的判断是 j > i + 1
因为 ji+1 开始,第一次出现 nums[j] 是合法的,只有当 j 至少是 i+2 且与前一个相同时才跳过。
四大剪枝优化
  1. 外层最小和剪枝:若 i 开头的最小四数和已超 target,直接 break(后续更大)
  2. 外层最大和剪枝:若 i 开头的最大四数和仍不足,continue(换更大的 i
  3. 内层最小和剪枝:固定 i,j 后,若最小和超 targetbreak 内层
  4. 内层最大和剪枝:固定 i,j 后,若最大和不足,continue(换更大的 j
注意:由于 target 可能为负数,不能省略任何剪枝条件
例如:nums = [-5, -4, -3, -2, -1], target = -10,若错误地认为“和为负就跳过”,会漏解。
双指针内层去重
  • 找到一组解后,跳过所有相同的 leftright,再各移动一步
  • 与三数之和完全一致

复杂度分析

指标复杂度
时间复杂度O(n³)
空间复杂度O(1)(不计输出)
排序 O(n log n),两重循环 O(n²),双指针 O(n) → 总体 O(n³)

小结 & 面试技巧

  • 与三数之和的关系
    • 相同:排序 + 双指针 + 去重
    • 不同:多一层循环,剪枝条件更复杂
  • 三大易错点
    1. j 去重条件写错(应为 j > i + 1
    2. 忽略 target 为负数,导致剪枝逻辑错误
    3. 剪枝时未检查索引越界(但本题因循环范围已保证安全)
  • 扩展思考
    • 如何实现通用的 kSum 函数?(递归 + 双指针)
    • 若允许重复四元组,如何修改?(删除所有去重逻辑)

面试话术

“我在三数之和的基础上,增加了一层外循环固定第二个数。为提升效率,我加入了四重剪枝:在外层和内层分别判断最小/最大可能和是否超出目标。去重时,我确保只跳过本轮内的重复值。”

下期预告

明天我们将挑战第 19 题:删除链表的倒数第 N 个结点,带你用双指针一次遍历搞定链表定位!


坚持每天一道 LeetCode,用 Python 写出优雅代码,夯实算法基础,拿下心仪 Offer!
关注专栏,不错过每日更新!

Read more

X86、ARM与C86架构全面对比分析:性能、功耗、成本与生态系统

目录标题 * X86、ARM与C86架构全面对比分析:性能、功耗、成本与生态系统 * 一、架构概述与发展背景 * 1.1 X86架构:PC与服务器市场的传统霸主 * 1.2 ARM架构:移动领域的王者与新兴服务器力量 * 1.3 C86架构:国产x86兼容的创新尝试 * 二、性能表现对比分析 * 2.1 运算速度与数据处理能力 * 2.2 不同场景下的性能表现 * 2.3 性能优化与未来趋势 * 三、功耗与能效比分析 * 3.1 不同架构的功耗特性 * 3.2 不同应用场景下的能耗分析 * 3.3 能效优化技术与未来趋势 * 四、成本分析与经济性比较 * 4.1 芯片制造成本对比 * 4.2 不同应用场景的总体拥有成本(

By Ne0inhk
从SQL Server到KingbaseES:一步到位的跨平台迁移与性能优化指南

从SQL Server到KingbaseES:一步到位的跨平台迁移与性能优化指南

摘要:信创背景下,国产数据库正以惊人的兼容性和更优的成本效益赢得市场。本文详细介绍了国产数据库KingbaseES V9R4C12作为SQL Server替代方案的实战应用。通过代码示例展示了其在语法兼容性(95%以上T-SQL兼容)、数据类型支持、存储过程迁移等方面的优异表现。文章包含Windows/Linux安装指南、基础操作对比、高级特性实现(如分页查询、事务控制)以及TPCH100G性能测试结果(部分场景性能优于SQL Server)。特别强调了KingbaseES在信创背景下的合规优势,提供了迁移验证脚本和注意事项,证明其能实现低风险平滑迁移,同时大幅降低License成本。 一、为什么选择KingbaseES替代SQL Server? 在信创窗口期,许多使用SQL Server作为核心数据库的企业面临着合规性风险和高昂的License费用。经过多轮PoC验证, 金仓KingbaseES V9R4C12(SQL Server兼容版) 展现出强大的兼容能力,官方宣称"数据库平替用金仓",为背负2000+存储过程的系统提供了低风险迁移方案。 先来看一个直观的兼容性对比:

By Ne0inhk
数据库 SQL 防火墙:内核级防护,筑牢 SQL 注入安全防线

数据库 SQL 防火墙:内核级防护,筑牢 SQL 注入安全防线

在数字化转型持续深化的今天,数据早已从辅助资源升级为企业的核心生产要素。无论是政务系统、金融交易,还是工业控制、能源调度,数据库作为数据的最终载体,其安全直接关系到业务连续性与数据资产完整性。 在各类数据库安全威胁中,SQL注入凭借门槛低、隐蔽性强、破坏力大的特点,长期位居OWASP Top 10 Web应用安全风险前列。它就像潜伏在业务链路中的隐秘入侵者,利用应用逻辑漏洞,将恶意指令伪装成正常参数传入数据库,进而实现越权访问、数据窃取甚至删库破坏。 尽管行业内早已形成共识——通过预编译语句、参数化查询、输入校验等方式可以有效防范SQL注入,但在真实业务环境中,风险依然无处不在:老旧系统的遗留代码难以全面改造、第三方组件存在未知漏洞、多团队协作中难免出现编码疏漏、动态SQL拼接场景难以完全规范化……只要存在一处薄弱环节,就可能被攻击者利用,引发连锁安全事故。 面对这种“处处设防仍可能百密一疏”的困境,单纯依赖应用层加固显然不够。能否从数据库自身出发,构建一层独立、可靠、主动的防御体系?金仓数据库(KingbaseES)V009R002C014版本内置的SQL防火墙能力,正是从这一

By Ne0inhk
【Spring Boot】解锁高效安全之门:登录令牌技术的实战应用与价值解析

【Spring Boot】解锁高效安全之门:登录令牌技术的实战应用与价值解析

前言 🌟🌟本期讲解关于token令牌技术介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-ZEEKLOG博客 🔥 你的点赞就是小编不断更新的最大动力                                        🎆那么废话不多说直接开整吧~~  目录 📚️1.Session与Cookie 🚀1.1实现原理 🚀1.2集群环境情况 📚️2.令牌技术 🚀2.1实现校验原理 🚀2.2优缺点 🚀2.3JWT令牌 2.3.1JWT组成 2.3.2JWT令牌⽣成和校验 2.3.3生成令牌  2.3.4密钥的生成 2.3.5令牌的解析 📚️3.令牌技术的使用 🚀3.1令牌技术功能类 🚀3.2controller层 📚️4.总结   📚️1.Session与Cookie 🚀1.1实现原理 传统情况下:

By Ne0inhk