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

15. 三数之和

一、简单分析

题目的输出:输出的顺序和三元组的顺序不重要。也就是可能出现重复结果,需要消重。

例如,从题目给的示例1中,正常全排列的方式能够得到3个结果,但是其中2个结果是重复的。

那么本题既然三元组的顺序不管,那么就可以使用排列。

排列后,只有出现 最左边有负值,最右边有正值的情况,才有机会三数之和为0;

以下都是不对的:

  • 左负,右负
  • 左正,右正

从而想到左边加上右边后,离0值还差多远。而这个差值,则遍历去寻找。

二、算法逻辑

1)设左值针 left = i+1,右指针 right = n-1

2)如果 num[i] + num[left] + num[right] = 0,就保存这三个三元组。

3)如果 num[i] + num[left] + num[right] > 0,说明 num[right] 大了,那么 right 指针左移。

4)如果 num[i] + num[left] + num[right] < 0,说明 num[left] 小了,那么 left 指针右移动。

5)左右指针在移动的时候,需要判断和下个位置的值是否重合。重复了,就继续移动。

6)这左右指针的相对位置不能改变,改变就可以退出了。

三、代码逻辑

具体在代码中实现时,由于是从左往右遍历,就省略 (4) 的判断了

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {//排序//二维数组保存输出//遍历指针//和上一次枚举的数不同//右指针初始成最右端//左指针比遍历指针后一个位置//和上一次枚举的数不同//左指针在右指针左边//如果三和大于0,右指针左移//指针重合就退出循环//如果三和等于0,存入二维数组中//返回二维数组}
};

完整代码

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {int n = nums.size();//排序sort(nums.begin(), nums.end());//二维数组保存输出vector<vector<int>> ans;//遍历指针for(int i = 0; i < n; i++){//和上一次枚举的数不同,否则继续右移if(i > 0 && nums[i] == nums[i - 1]){continue;}//右指针初始成最右端int right = n - 1;int target = -nums[i];//左指针比遍历指针后一个位置for (int left = i + 1; left < n; left++){//和上一次枚举的数不同if( left > i + 1 && nums[left] == nums[left -1 ])continue;//左指针在右指针左边while(left < right && nums[left] + nums[right] > target){//如果三和大于0,右指针左移right --;}//指针重合就退出循环if(left == right)break;//如果三和等于0,存入二维数组中if( nums[left] + nums[right] == target)ans.push_back({nums[i], nums[left], nums[right]});}}//返回二维数组return ans; }
};

http://www.xdnf.cn/news/684.html

相关文章:

  • 计算机网络中的网络层:架构、功能与重要性
  • llama factory
  • springboot+vue3+mysql+websocket实现的即时通讯软件
  • C++数组栈与链表栈
  • 软考高级系统架构设计师-第16章 数学与经济管理
  • 切换 Python 版本(配置path方式,含trae)
  • 一个最简单的 Model Context Protocol 的例子
  • Halcon应用:相机标定
  • C++入门篇(下)
  • 线性DP:最长上升子序列(可不连续,数组必须连续)
  • Matlab 复合模糊PID
  • NumPy:数值计算基础与高性能数组操作
  • 如何使用人工智能大模型,免费快速写工作总结?
  • Linux基础指令 补充(自用)
  • 【微知】服务器如何获取服务器的SN序列号信息?(dmidecode -t 1)
  • Origin将双Y轴柱状图升级为双向分组柱状图
  • 二、在springboot 中使用 AIService
  • 【JAVA EE初阶】多线程(1)
  • 代码随想录算法训练营第五十三天 | 105.有向图的完全可达性 106.岛屿的周长
  • 如何轻松实现用户充值系统的API自动化测试
  • QML、Qt Quick 、Qt Quick Controls 2
  • 如何成为Prompt工程师:学习路径、核心技能与职业发展
  • STM32时钟树
  • 微信小程序中使用h5页面预览图片、视频、pdf文件
  • PHP伪协议读取文件
  • Matlab 步进电机传递函数模糊pid
  • langchain-nextjs-template 模板安装与配置
  • 【文献阅读】EndoNet A Deep Architecture for Recognition Tasks on Laparoscopic Videos
  • 【MRAG】使用RAG技术增强AI回复的实时性和准确性
  • Android Kotlin AIDL 完整实现与优化指南