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

力扣(LeetCode) ——15.三数之和(C++)

📌个人专栏: C++、数据结构、力扣——每日一题

题目:三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例1:

输入: nums = [-1,0,1,2,-1,-4]
输出: [[-1,-1,2],[-1,0,1]]
解释: nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例2:

输入: nums = [0,1,1]
输出: []
解释: 唯一可能的三元组和不为 0 。

示例3:

输入: nums = [0,0,0]
输出: [[0,0,0]]
解释: 唯一可能的三元组和为 0 。

解题思路:

根据题目要求返回最终结果为0。

第一步排序处理
排序预处理便于后续通过双指针调整元素组合,缩小查找范围,跳过重复元素,避免结果中出现重复三元组。

第二步固定第一个元素再使用双指针找剩余两元素
遍历数组,以当前元素 nums[i] 作为三元组的第一个元素(固定值):
若 nums[i] > 0,由于数组已排序,后续元素均大于等于 nums[i],三数之和必大于 0,可直接终止循环。
对于每个 nums[i],使用双指针寻找另外两个元素:
left 指针从 i+1 开始,向右移动;
right 指针从数组末尾开始,向左移动。
第三步双指针调整与求和判断
计算当前三数之和 sum = nums[i] + nums[left] + nums[right]:
若 sum > 0:说明和过大,需减小右侧元素,将 right 左移;
若 sum < 0:说明和过小,需增大左侧元素,将 left 右移;
若 sum == 0:找到符合条件的三元组,存入结果集。
之后同时移动 left 右移和 right 左移,继续寻找新的组合;
移动过程中跳过重复元素(如 nums[left] 与前一个元素相同则继续右移,nums[right] 与后一个元素相同则继续左移),避免重复三元组。
第四步跳过重复的固定元素
遍历完一个 nums[i] 后,将 i 右移,并跳过所有与 nums[i-1] 相同的元素,确保第一个元素不重复,进一步避免结果重复。
通过以上步骤,算法在排序O(n log n)的基础上,通过双指针遍历O(n²),高效找到所有不重复的三元组,时间复杂度为O(n^2^),空间复杂度主要为排序所需的O(log n)

最终代码:

vector<vector<int>> threeSum(vector<int>& nums) 
{vector<vector<int>> ret;//排序sort(nums.begin(), nums.end());int n = nums.size();int i = 0;while(i < n){if(nums[i] > 0) break;int left = i + 1, right = n - 1;while(left < right){int sum = nums[left] + nums[right];if(sum + nums[i] > 0) right--;else if(sum + nums[i] < 0) left++;//判断是否等于0else{//存放值ret.push_back({nums[i],nums[left],nums[right]});left++;right--;//跳过重复元素while(left < right && nums[left] == nums[left - 1]) left++;while(left < right && nums[right] == nums[right + 1]) right--;}}i++;//跳过重复元素while(i < n && nums[i] == nums[i-1]) i++;}return ret;}

赶紧动起手来吧!!!
点击下方即可跳转
三数之和

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

相关文章:

  • Kubernetes GPU 运维组件介绍
  • 龙中龙网站开发wordpress 判断函数
  • 网站开发流程框架手机软件开发和网站开发
  • 定时发布文章测试
  • 联邦快递网站建设的目标重庆平台网站推广
  • 医院 网站建设成品网站价格表
  • 第14天:系统监控与日志管理
  • 区块链分层架构或侧链/子链
  • Ethernaut Level 14: Gatekeeper Two - 合约创建时的 extcodesize
  • 网页网站建设难吗深圳网络营销推广公司
  • 东莞网站开发深圳做网站做app
  • 18.矩阵置零(原地算法)
  • Lambda表达式的使用
  • Pinterest Data Scientist 面试经验分享|数据分析 + 实验设计 + 产品洞察并重
  • 重庆璧山网站建设营销型网站的建设流程
  • 做网站用什么软件ps字体文化公司网页设计
  • 【Linux网络】实现简单的英译汉网络字典
  • 管理信息系统与网站建设有什么区别wordpress 网页模块错位
  • ansible实战-不同的用户登录不同的主机
  • 电子电气架构 ---汽车产业数字化发展背景
  • 开源Wiki系统基础知识点及避坑要点
  • 做logo专用的网站是哪个可以上传图片的公司网站
  • 网站建设企业网站制作品牌网站怎么做seo
  • K8s学习笔记(二十二) 网络组件 Flannel与Calico
  • HBM = High Bandwidth Memory(高带宽显存)
  • kali安装nessus
  • Kuboard部署服务
  • 如何做网站调研如何用ps做网站效果图
  • 网站建设与管理专业好找工作吗做网站有一个火箭回顶部
  • grafana dashboard 监控 json 文件 uid 长度限制