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

D11 15. 三数之和 18. 四数之和

15 三数之和(力扣:[https://leetcode.cn/problems/3sum/])

条件:给定一个含>=3个元素的数组nums,找到有多少个元素a+b+c = 0,并返回所有[a,b,c],要求[a,b,c]不重复;
Tips:

  1. 题目中要求不重复,所以使用哈希还要额外去重,而由于哈希是通过映射到哈希值来记录所有可用情况的,所以使用哈希再降重效率不高;此外要求[a,b,c]中元素的下标不重复,没有要求a≠b≠c,所以注意全0和存在相等元素的数组是合法的,只是解的某一个位置上( 如a )遇到一群相同数字则只保留一个数字、其他相同不计入;
  2. 参考链接:由于不需要输出原下标、又要求使用的元素下标必须不同但值可以相同,所以先将数组元素根据值重新排序,再用双指针计算当前元素是否有解;而发现解后要排除相同元素,注意当前元素的重复值和边界的重复值都是只记录第一个,但当前元素的重复值是当前值和前一个元素比,重复则continue跳过本次迭代

代码来自ai修改 :

点击查看代码
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {// 定义结果集vector<vector<int>> result;// 先对数组进行排序sort(nums.begin(), nums.end());// 如果排序后是全正数数组则直接返回空resultif (nums[0] > 0) {return result;}// 存储所能走到的最大下标int size = nums.size() - 1;// 从小到大遍历数组for (int tmp = 0; tmp <= size; tmp++) {// 如果当前几个nums值重复,则跳到for的判断,前进到最后一个重复numsif (tmp > 0 && nums[tmp] == nums[tmp - 1]) {continue; // 跳过重复,只处理第一个}// 先保证当前的下标left和right没有重合for (int left = tmp + 1, right = size; left < right;) {// 比较left+right与 0 - nums[tmp]// 相等则记录left和right对应的值if (nums[tmp] + nums[left] + nums[right] == 0) {result.push_back(vector<int>{nums[tmp], nums[left], nums[right]});// 在找到一个符合条件的组后收缩边界,但前提是L+1/R-1的值不是重复的while (left < right && nums[left] == nums[left + 1])left++;while (left < right && nums[right] == nums[right - 1])right--;// 两个while循环会听到新值的前/后一位,收缩边界即可left++;right--;// L+R小则应向右移动L使L+R增大// 每次移动一位保证每次移动都会返回for进行判断当前left和right没有相遇} else if (nums[left] + nums[right] < 0 - nums[tmp]) {left++;// L+R大则应向左移动R使L+R减小} else if (nums[left] + nums[right] > 0 - nums[tmp]) {right--;}}}return result;}
};

18 四数之和(力扣:[https://leetcode.cn/problems/4sum/])

条件: 给定一个数组和一个target值,要求找不重复四元组 nums[a], nums[b], nums[c], nums[d],abcd不重复且四元组的和为target;
Tips:

  1. 注意,在所有去重(涉及例如nums[a+1]或者nums[b-1])为了保证下标(的+或1操作)不越界,要把针对下标本身的约束放在前,如if( nums[a]nums[a-1] && a>0)会越界,要写成 if( a>0 && nums[a]nums[a-1]); 此外计算sum的时候要定义成long型否则也会溢出!其它见代码注释,参考链接

代码来自ai修改

点击查看代码
class Solution {public:vector<vector<int>> fourSum(vector<int>& nums, int target) {// 新建答案集vector<vector<int>> result = {};// 注意,本题和三数之和不同,最小长度为1,所以可以用nums.size排除if (nums.size() < 4) {return result;}// 不重复先排序sort(nums.begin(), nums.end());// 排序后从头挨个遍历到倒数第三个作为第一个元素nums[a]for (int a = 0; a < nums.size() - 3; a++) {// 注意,由于target值是不确定的,所以可以通过第一个nums判断// 当nums[a]大于target且为0或正数则后面不会有负数存在if (nums[a] > target && nums[a] >= 0) {break;}// 当nums[a] == nums[a+1]时只处理重复值的第一个// 但这里使用a-1为了使用continue跳过后面的重复值,注意不要让a-1越界if ( a > 0 && nums[a] == nums[a - 1] ) {continue;}// 在a去重后接着让nums[b]从nums[a]后一个开始遍历for (int b = a + 1; b < nums.size() - 2; b++) {// 去重,原理同aif ( b > a+1 && nums[b] == nums[b - 1] ) {continue;}// 在确定ab后,一头一尾开始收缩c、d的范围直到cd相遇for (int c = b + 1, d = nums.size() - 1; c < d;) {// 出现答案元组if ((long)nums[a] + nums[b] + nums[c] + nums[d] == target) {result.push_back(vector<int>{nums[a], nums[b], nums[c], nums[d]});// 去重while (c < d && nums[c] == nums[c + 1]) {c++;}while (c < d && nums[d] == nums[d - 1]) {d--;}// 去重后同时收缩!c++;d--;// 当前答案小于target, 向右收缩边界使增大} else if ((long)nums[a] + nums[b] + nums[c] + nums[d] < target) {c++;}// 当前答案大于target, 向左收缩边界使减小else if ((long)nums[a] + nums[b] + nums[c] + nums[d] > target) {d--;}}}}return result;}
};
http://www.jsqmd.com/news/636434/

相关文章:

  • 2026贵阳车牌识别系统与无人值守停车场完全指南:5大本土品牌深度横评+官方直达联系方式 - 精选优质企业推荐榜
  • EtherCAT:工业自动化中的实时通信引擎
  • 别再乱用配合了!SolidWorks装配体设计中‘重合’、‘同轴’、‘距离’三大核心关系的深度解析与实战技巧
  • ESPS USB MSC 调试全过程记录范
  • 璀璨星河Starry Night应用场景:儿童绘本AI辅助创作落地案例
  • 深度解析猫抓扩展:从资源嗅探到流媒体下载的全面实战指南
  • 零基础快速上手:CodeFormer AI人脸修复开源工具完全指南
  • 别再数据线了!用FastAPI 分钟搭个局域网文件+剪贴板神器刭
  • 5分钟掌握模糊PID控制器:让机器人控制像人脑一样智能思考
  • C语言_数组_题3
  • 从CTF赛题到实战:利用phar伪协议绕过上传限制的攻防演练
  • CSS如何保证移动端顶部Fixed头部的安全区域
  • 打通智能体孤岛:用 AgentRun 构建生产级 AA 多 Agent 管理协作系统僦
  • 别再迷信仿真!实测STM32的3.3V PWM也能驱动IR2104(附完整代码与波形分析)
  • PubTest_1775973795700
  • 大学思政课高分通关秘籍:我用思维导图搞定马原期末考试(附全套复习资料)
  • 大模型平台选型指南:从Xinference的分布式架构到Ollama的轻量哲学
  • RK3576摄像头MIPI-CSI拆分与DTS解析
  • 二维核密度估计图 (KDE Plot) 实战:用 Seaborn 解锁双变量数据分布的深层洞察
  • 告别手动配置烦恼:OpCore-Simplify智能黑苹果配置助手终极指南
  • **反编译防护新思路:基于混淆+加密的C++程序加固实战**在软件安全领域,**反编译防护**始终是开发者绕不开
  • SpaceClaim旋风分离器建模实战:从粗到细的精准设计
  • 从赛季数据到模板图库:深入解析 tft_fetch_assets.py和TFT 截图识别的资源构建链路
  • 猫抓浏览器扩展:3分钟掌握网页视频音频资源一键下载完整指南
  • 低成本DIY家庭监控:基于ESP32-CAM和OV2640的无线视频流方案实战
  • 在jupyter里面画图,并且显示中文字体
  • 别再弯腰插拔了!用闲置MicroUSB线和CH340N芯片,5分钟自制桌面TTL调试神器
  • 提示词工程(Prompt Engineering)-周红伟
  • 大数据分析与挖掘实战平台 实训报告
  • Harness Engineering(驾驭工程)-2026年最强的智能体-周红伟