N-Sum 的算法思想与模板

news/2026/1/18 16:19:53/文章来源:https://www.cnblogs.com/leonPersevere/p/19498676

终结 N-Sum 的算法思想与模板:以 3-Sum 和 4-Sum 为例

在算法面试和 LeetCode 中,N-Sum 问题是一个经典的考察点。无论是 3-Sum,还是 4-Sum,这些问题都是基于同一个核心思想:排序 + 双指针收缩。本文将通过 3-Sum4-Sum 两个经典问题来详细解析 N-Sum 问题的解决思路、技巧与模板。


一、N-Sum 问题的核心思想

1.1 问题的背景

N-Sum 问题的核心是给定一个整数数组,求该数组中 N 个数之和等于目标值 target 的所有唯一组合。以 3-Sum 为例,它的目标是找到数组中三个数的和等于目标值。类似地,4-Sum 就是四个数之和等于目标值。

具体题目描述如下:

  • 3-Sum:给定一个整数数组 nums,找出所有三数之和为零的组合。
  • 4-Sum:给定一个整数数组 nums,找出所有四数之和为目标值 target 的组合。

1.2 N-Sum 的解决核心思想

N-Sum 问题的核心思想是:

  1. 排序数组:首先对数组进行排序。排序可以帮助我们利用双指针来减少不必要的计算,并且在后续步骤中轻松实现去重操作。
  2. 固定一个数:通过固定一个数来将问题降维。例如,在 3-Sum 中固定第一个数,问题变成在剩下的部分找两数之和为目标值。对于 4-Sum,固定前两个数,问题变成了 2-Sum 问题。
  3. 双指针夹逼:固定一个数后,使用双指针从数组两端夹逼,逐步寻找符合条件的组合。根据当前和与目标值的比较,移动左右指针来调整和的大小。
  4. 去重:避免重复的组合。在每一层固定值后,我们需要跳过重复的元素,以免生成重复的结果。

通过这样的思想,我们可以将时间复杂度从暴力枚举的 O(n^N) 降低到 O(n^2)


二、3-Sum 的算法实现

2.1 问题描述

给定一个包含 n 个整数的数组 nums,判断是否存在三个整数使得它们的和为零。如果存在,返回所有不重复的三元组。

2.2 3-Sum 的解法

  1. 排序数组:首先对 nums 数组进行排序,使得数组从小到大排列。
  2. 固定一个数:我们用一个指针固定第一个数,然后用另外两个指针来查找剩余部分。
  3. 双指针查找两数之和:在固定第一个数后,问题就变成了 2-Sum 问题,利用双指针查找剩余两个数的和。
  4. 去重处理:我们在每次固定一个数后,要跳过重复的数。

2.3 代码实现

#include <stdio.h>
#include <stdlib.h>// 比较函数,用于排序
int cmp(const void* a, const void* b) {return (*(int*)a - *(int*)b);
}int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {int** ans = (int**)malloc(sizeof(int*) * 20000);*returnColumnSizes = (int*)malloc(sizeof(int) * 20000);*returnSize = 0;if (numsSize < 3) return ans;// 排序qsort(nums, numsSize, sizeof(int), cmp);for (int i = 0; i < numsSize - 2; i++) {// 去重if (i > 0 && nums[i] == nums[i - 1]) continue;int left = i + 1, right = numsSize - 1;while (left < right) {int sum = nums[i] + nums[left] + nums[right];if (sum == 0) {ans[*returnSize] = (int*)malloc(sizeof(int) * 3);ans[*returnSize][0] = nums[i];ans[*returnSize][1] = nums[left];ans[*returnSize][2] = nums[right];(*returnColumnSizes)[*returnSize] = 3;(*returnSize)++;// 去重while (left < right && nums[left] == nums[left + 1]) left++;while (left < right && nums[right] == nums[right - 1]) right--;left++;right--;} else if (sum < 0) {left++;} else {right--;}}}return ans;
}

2.4 解释

  1. 排序:通过 qsort 排序数组,方便后续的双指针夹逼。
  2. 固定一个数:每次固定一个数 nums[i],然后使用双指针查找 nums[left]nums[right],使得三数之和为零。
  3. 去重:在每次固定 i 后,跳过重复的元素,以避免重复的三元组。

三、4-Sum 的算法实现

3.1 问题描述

给定一个包含 n 个整数的数组 nums 和目标值 target,判断是否存在四个整数使得它们的和为 target。如果存在,返回所有不重复的四元组。

3.2 4-Sum 的解法

  1. 排序数组:首先对 nums 数组进行排序,使得数组从小到大排列。
  2. 固定两个数:通过两个指针 ij 分别固定前两个数,然后将问题降维为 2-Sum 问题。
  3. 双指针查找两数之和:在固定前两个数后,使用双指针查找剩余两个数的和。
  4. 去重处理:跳过重复的元素,避免重复的四元组。

3.3 代码实现

int** fourSum(int* nums, int numsSize, int target, int* returnSize, int** returnColumnSizes) {int** ans = (int**)malloc(sizeof(int*) * 20000);*returnColumnSizes = (int*)malloc(sizeof(int) * 20000);*returnSize = 0;if (numsSize < 4) return ans;qsort(nums, numsSize, sizeof(int), cmp);for (int i = 0; i < numsSize - 3; i++) {if (i > 0 && nums[i] == nums[i - 1]) continue;for (int j = i + 1; j < numsSize - 2; j++) {if (j > i + 1 && nums[j] == nums[j - 1]) continue;int left = j + 1, right = numsSize - 1;while (left < right) {int sum = nums[i] + nums[j] + nums[left] + nums[right];if (sum == target) {ans[*returnSize] = (int*)malloc(sizeof(int) * 4);ans[*returnSize][0] = nums[i];ans[*returnSize][1] = nums[j];ans[*returnSize][2] = nums[left];ans[*returnSize][3] = nums[right];(*returnColumnSizes)[*returnSize] = 4;(*returnSize)++;while (left < right && nums[left] == nums[left + 1]) left++;while (left < right && nums[right] == nums[right - 1]) right--;left++;right--;} else if (sum < target) {left++;} else {right--;}}}}return ans;
}

3.4 解释

  1. 排序:通过排序,我们可以方便地进行双指针操作,并且去除重复的结果。
  2. 固定两个数:通过两个指针 ij 固定前两个数,将问题简化为 2-Sum 问题。
  3. 双指针查找剩余两个数:剩余的两个数通过双指针 leftright 查找。
  4. 去重:每次固定一个数时,需要跳过重复元素,避免重复结果。

四、总结与模板

4.1 3-Sum 和 4-Sum 模板

  1. 排序:先排序数组。
  2. 固定前几个数:固定第一个数或者前两个数。
  3. 双指针:利用双指针找剩下的两个数。
  4. 去重:跳过重复的元素,避免重复的组合。

4.2 时间复杂度

  • 排序:O(n log n)
  • 外层循环:O(n)
  • 内层双指针:O(n)

总体时间复杂度为:O(n^2)

4.3 使用模板

无论是 3-Sum 还是 4-Sum,基于排序和双指针的思路是最标准和高效的解法。可以通过这种方式解决所有类似的 N-Sum 问题。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1178680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2026最新贵州装修设计公司top5榜单发布!贵阳等地装修品牌及施工队综合实力测评,工艺与口碑双优助力品质家居生活 - 品牌推荐2026

引言 随着家居消费升级,消费者对装修设计的实用性、耐用性与个性化需求日益提升,但行业存在设计同质化、工艺不透明、售后无保障等问题,导致装修体验大打折扣。据中国建筑装饰协会2025年度报告显示,全国家装行业投…

哪一种辅酶Q10最好?2026辅酶q10十大热门排行榜,为心脏保驾护航 - 博客万

哪一种辅酶Q10最好?2026辅酶q10十大热门排行榜,为心脏保驾护航 打开购物软件,辅酶Q10的热门推荐刷不完,每款都标注“护心优选”“热门爆款”,评论区更是清一色好评。可真正买回家尝试,要么没感受到任何正向反馈,…

2026最新贵州大平层装修公司top5榜单发布!贵阳等地装修品牌及施工队综合实力测评 - 品牌推荐2026

引言 随着改善型住房需求持续增长,大平层装修市场迎来品质升级新浪潮,但行业存在设计同质化、工艺不透明、售后无保障等问题,消费者选择难度显著增加。据中国室内装饰协会2026年第一季度数据显示,全国大平层装修投…

探讨怎样在AI搜索上把企业推广出去,宁波国技互联案例分析 - 工业品牌热点

在AI技术重塑商业生态的今天,如何通过AI搜索为企业做推广、怎样在AI搜索上把企业推广出去,已成为中小企业突破增长瓶颈的关键命题。宁波国技互联作为深耕数字经济领域的先行者,凭借独创的GEO-AI搜索体系,为企业提供…

2026年剖析AI搜索优化广告,宁波国技互联独特优势大揭秘 - 工业品牌热点

在AI技术深度融入商业生态的今天,一套高效的AI搜索优化方案是企业打通智能营销链路、实现精准获客的核心抓手。面对市场上良莠不齐的AI搜索服务提供商,如何找到既懂技术又懂行业的合作伙伴?以下结合不同服务类型,为…

完整教程:从 C 链表到 Android Looper:MessageQueue 的底层原理一条线讲透

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

hdu1059 多重背包

import java.util.Scanner;public class hdu1059 {//01背包public static boolean bag(int[] weight,int[] value,int V){int[] res = new int[V+1];for (int i = 0; i < weight.length; i++) {for (int j = V; j &…

国产时序数据库 2026 图鉴:金仓的融合创新与赛道演进方向

前言 进入2026年&#xff0c;在“数字中国”与工业物联网浪潮的强劲推动下&#xff0c;国产时序数据库市场持续繁荣&#xff0c;竞争格局日趋清晰。本文将对当前主流的国产时序数据库进行梳理盘点&#xff0c;并特别聚焦于金仓数据库&#xff08;Kingbase&#xff09;&#xff…

hdu1059 多重背包

import java.util.Scanner;public class hdu1059 {//01背包public static boolean bag(int[] weight,int[] value,int V){int[] res = new int[V+1];for (int i = 0; i < weight.length; i++) {for (int j = V; j &…

RPM打包进阶:mock与rpmbuild的宏定义传递及spec文件自定义宏实践

在Linux软件包管理领域&#xff0c;RPM&#xff08;Red Hat Package Manager&#xff09;凭借其强大的构建和分发能力成为主流解决方案。本文将深入解析mock和rpmbuild工具中宏定义的传递机制&#xff0c;结合spec文件自定义宏的实践方法&#xff0c;为开发者提供系统化的RPM打…

2026食品级流量计优选:实力厂家质量保障指南,过热蒸汽流量计/插入式双文丘里/压力变送器,食品级流量计公司怎么选购 - 品牌推荐师

在食品饮料、生物制药、乳制品等关乎民生健康的行业中,流量计作为过程控制与物料计量的关键仪表,其重要性不言而喻。食品级流量计不仅需要满足基础的流量测量精度与稳定性,更需符合严格的卫生标准,如易于清洁、防止…

基于Python+django+vue3的高校大学生网上选课网站的设计与实现

目录摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 随着信息技术的发展&#xff0c;高校教务管理逐步向数字化、智能化转型。传统的线下选课方式存在效率低、资源分配不均等问题&…

2026年宁波地区AI搜索推广公司排名,这些靠谱企业值得关注 - 工业品牌热点

2026年,浙江AI+产业融合发展进入攻坚阶段,AI搜索推广与智能引流系统已成为中小企业破解获客难、转型慢痛点的关键抓手。无论是生成式引擎优化(GEO)驱动的精准获客,还是AI智能体全场景赋能,优质AI搜索推广公司的专…

2025年市面上评价高的汽车微动开关实力厂家哪里有,电动推杆微动开关/小型微动开关/防水微动开关直销厂家哪里有 - 品牌推荐师

新能源赛道下的微动开关技术竞争与市场格局 随着新能源汽车渗透率突破40%,汽车电子系统对高可靠性微动开关的需求呈现爆发式增长。作为汽车座椅调节、车窗控制、电池管理系统等核心模块的关键组件,微动开关的性能直接…

2026最新贵州实景还原家装公司top5榜单发布!贵阳等地装修品牌及施工队综合实力测评,实景还原工艺助力品质家居生活 - 品牌推荐2026

引言 随着居住需求升级,家装行业已从单纯装修转向"所见即所得"的实景还原时代,但设计与落地脱节、工艺标准缺失等问题仍普遍存在。据中国建筑装饰协会2025年度报告显示,全国家装实景还原达标率仅58%,超6…

收集自己的每日早餐类型(包子,豆浆,面包),统计各类型的食材占比,输出营养早餐搭配建议

1. 实际应用场景描述场景某上班族希望改善早餐习惯&#xff0c;记录每日早餐类型&#xff08;如包子、豆浆、面包等&#xff09;&#xff0c;并统计各类型的食材占比&#xff0c;从而分析营养结构&#xff0c;获得科学的早餐搭配建议。痛点- 手动记录早餐种类繁琐- 难以量化不同…

学习unigui【45】UnimDatePicker等按钮汉化崩溃

学习unigui【45】UnimDatePicker等按钮汉化崩溃UnimDatePicker等按钮汉化会导致程序崩溃。1 function afterCreate(sender)2 {3 try{4 var pkr = sender.getPicker && sender.getPicker();5 if(!pkr) retu…

压箱底的华润万家购物卡别浪费!3 个靠谱渠道盘活沉睡资产 - 可可收

你家是不是也有一张被遗忘的华润万家购物卡?明明是实打实的消费额度,却被搁置成了 “沉睡资产”。超 68% 的消费者手中至少躺着 1 张闲置购物卡,人均年均闲置金额高达 800 元。其实不用愁,选对回收渠道,这些卡就能…

宏智树 AI:ChatGPT 学术版驱动的全流程学术创作智能引擎

在人工智能深度赋能学术研究的新时代&#xff0c;如何高效攻克论文写作从选题构思到答辩定稿的全链路难题&#xff0c;成为科研人、高校师生的核心诉求。宏智树 AI&#xff08;官网www.hzsxueshu.com&#xff0c;微信公众号搜一搜 “宏智树 AI”&#xff09;应势而生&#xff0…

2026最新贵州改善型装修公司top5榜单发布!贵阳等地装修品牌及施工队综合实力测评,品质工艺双优助力品质家居生活 - 品牌推荐2026

引言 随着人们生活水平的提升,改善型住房需求日益增长,改善型装修市场也迎来了新的发展机遇。消费者在追求居住空间舒适与美观的同时,对装修的实用性、工艺质量和服务体验提出了更高要求。然而,当前装修行业存在设…