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

数据结构算法-哈希表:四数之和

1.1 、问题描述:四数之和

力扣题目链接https://leetcode.cn/problems/4sum/

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

  • 0 <= a, b, c, d < n
  • abc 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。

1.2、核心思路拆解(清晰版):

  1. 排序先行:数组排序后,既能通过双指针灵活调整总和,又能让重复元素相邻,方便去重。

  2. 两层循环固定前两数

    • 第一层循环固定第一个数 a = nums[k],第二层循环固定第二个数 b = nums[i]i > k 避免重复)。
  3. 剪枝优化

    • 当 a 或 a+b 已大于 target,且当前和为正或 target 为正(避免负数场景误剪),后续数更大,总和必超 target,直接 break。
  4. 去重逻辑

    • 对 a:若 nums[k] == nums[k-1]k>0),跳过(避免重复四元组)。
    • 对 b:若 nums[i] == nums[i-1]i>k+1),跳过(确保不与前一个 b 重复)。
  5. 双指针找后两数

    • left 从 i+1 开始(c),right 从数组末尾开始(d)。
    • 计算四数总和:
      • 总和 > target → right--(减小 d);
      • 总和 < target → left++(增大 c);
      • 总和 = target → 加入结果,同时跳过重复的 c 和 d,再移动指针继续找。

1.3、代码实现 

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class FourSum {// 四数之和:返回所有不重复的四元组 (a,b,c,d) 使得 a+b+c+d = targetpublic List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> result = new ArrayList<>();int n = nums.length;// 边界条件:数组元素不足4个,直接返回空if (n < 4) {return result;}// 1. 排序数组(核心前提:为双指针移动和去重提供基础)Arrays.sort(nums);// 2. 第一层循环:固定第一个数 a = nums[k]for (int k = 0; k < n - 3; k++) {// 剪枝优化:若当前a已大于target,且a为正或target为正,后续数更大,总和必超targetif (nums[k] > target && (nums[k] >= 0 || target >= 0)) {break;}// 去重a:当前a与前一个a相同,跳过(避免重复四元组)if (k > 0 && nums[k] == nums[k - 1]) {continue;}// 3. 第二层循环:固定第二个数 b = nums[i](i从k+1开始,确保a在b左侧)for (int i = k + 1; i < n - 2; i++) {// 剪枝优化:a+b已大于target,且a+b为正或target为正,后续数更大,总和必超targetlong sumAB = (long) nums[k] + nums[i]; // 用long避免int溢出if (sumAB > target && (sumAB >= 0 || target >= 0)) {break;}// 去重b:当前b与前一个b相同(且前一个b的位置在k之后),跳过if (i > k + 1 && nums[i] == nums[i - 1]) {continue;}// 4. 双指针找 c 和 d:c在b右侧,d在数组末尾int left = i + 1;  // c = nums[left]int right = n - 1; // d = nums[right]// 5. 根据四数之和调整指针while (left < right) {long total = sumAB + nums[left] + nums[right]; // 用long避免溢出if (total > target) {// 总和太大,右指针左移(减小d)right--;} else if (total < target) {// 总和太小,左指针右移(增大c)left++;} else {// 找到有效四元组,加入结果result.add(Arrays.asList(nums[k], nums[i], nums[left], nums[right]));// 去重c:跳过重复的c值(避免同一a、b下的重复四元组)while (left < right && nums[left] == nums[left + 1]) {left++;}// 去重d:跳过重复的d值while (left < right && nums[right] == nums[right - 1]) {right--;}// 移动指针,继续寻找下一组c、dleft++;right--;}}}}return result;}// 测试public static void main(String[] args) {FourSum solution = new FourSum();int[] nums = {1, 0, -1, 0, -2, 2};int target = 0;List<List<Integer>> result = solution.fourSum(nums, target);System.out.println("符合条件的四元组有 " + result.size() + " 个:");for (List<Integer> quad : result) {System.out.println(quad);}}
}

个人总结学习用,对部分内容进行了简单的处理和归纳,如有谬误,希望大家指出,
持续修订更新中。

参考文档:

  1. 程序员 Carl. 代码随想录(LeetCode 数据结构与算法刷题攻略)(EB/OL). https://www.programmercarl.com/,2025-02/2025-10.
  2. 《数据结构》课程教学大纲(2024 版)(EB/OL). https://m.book118.com/html/2024/0423/8110022111006061.shtm,2024-04/2025-10.
  3. 《数据结构》课程教学大纲(软件工程专业)(EB/OL). https://m.renrendoc.com/paper/329728026.html,2024-05/2025-10.
  4. 程序员 Carl. LeetCode-Master(代码随想录刷题攻略 GitHub 仓库)(EB/OL). https://github.com/youngyangyang04/leetcode-master,2025-09/2025-10.

http://www.dtcms.com/a/618064.html

相关文章:

  • 杭州翰臣科技有限公司优化方案物理必修三电子版
  • ASC学习笔记0024:移除一个现有的属性集
  • 洛阳做网站公司在哪建设工程信息管理网
  • win10安装miniforge+mamba替代miniconda
  • 旅游类网站策划建设_广告排版设计图片
  • Linux进程间通信三System V 共享内存完全指南原理系统调用与 C 封装实现
  • 云计算与大数据:数字化转型的双重引擎
  • 怎么弄免费的空间做网站铂爵旅拍婚纱摄影官网
  • 郑州中原区网站建设北京冬奥会网页设计
  • Java接口自动化测试之接口加密
  • 插值——Hermite 插值与分段三次 Hermite 插值
  • 外贸建站服务网站计划
  • tcp_Calculator(自定义协议,序列化,反序列化)
  • 【12】FAST角点检测:从算法原理到OpenCV实时实现详解
  • 设计模式实战精讲:全景目录
  • 【2025】 Java 从入门到实战:基础语法与面向对象三大特性巩固练习讲解(附案例练习与答案)
  • Linux:基础开发工具(四)
  • 【USACO25OPEN】It‘s Mooin‘ Time III B
  • OpenGL:Cube Map
  • 《玩转Docker》[应用篇17]:容器可视化管理平台-Docker安装部署Portainer
  • 开平 做一网站建设工程教育网建设工程类的考试辅导网站
  • 多线程 -- 初阶(4) [单例模式 阻塞队列]
  • 如何用VS2017做网站加盟商网站建设
  • HTML 基础知识二:创建容器和表格(附html实战案例)
  • OpenCV(二十八):双边滤波
  • 【2025CVPR物体姿态估计方向】ONDA-Pose:面向自监督六维物体姿态估计的遮挡感知神经域自适应方法
  • 衡阳网站建设开发价格推广关键词排名查询
  • MATLAB基于IOWA-云模型的长距离引水工程运行安全风险评价研究
  • 基层建设论文查询官方网站零基础怎么做电商
  • 跨链如何实现消息互通,消息指的又是什么