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

三数之和_优选算法(C++)双指针

网页直达:

https://leetcode.cn/problems/1fGaJU

题目分析:

1.每个数只能选一次.

2.返回全部的不重复的三元组相加等于零的子数组.

一.暴力解法:(O(N^3))

排序+暴力枚举+利用set去重(容器去重).

二.排序+双指针法

1.排序;

2.固定一个数 a;

3.在该数后面的区间内,利用,单调性(可以筛选掉一大堆不成立的枚举)+双指针法,快速找到;;两个数为负a即可.

4.去重:可以利用set去重(容器去重).

利用unique先去重再寻找.

(优化):其实去重也可以利用单调性来实现,因为相同的数在排序的作用下已经在一起了,如果碰到相同的直接跳过就可以了.

这种题目需要多画图

我们通过几个图像过程来解析:

代码实现:

无详解:

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(), nums.end());vector<vector<int>> ret;int n = nums.size();for (int i = 0; i < n-2; i++) {if (nums[i] > 0)break;                           // 小优化if (i > 0 && nums[i] == nums[i - 1]) // 去重i{continue;}int right = n - 1;int left = i + 1;while (left < right) {int sum = nums[i] + nums[left] + nums[right];if (sum < 0) {left++;} else if (sum > 0) {right--;} else {ret.push_back({nums[i], nums[left], nums[right]}); // 语法while (left < right &&nums[left] == nums[left + 1]) // 实现去重,避免越界{left++;}while (left < right &&nums[right] == nums[right - 1]) // 实现去重,避免越界{right--;}left++;right--; // 找下一个,不漏掉全部情况}}}return ret;}
};

详解解析:

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(), nums.end());vector<vector<int>> ret;//储存结果int n = nums.size();for (int i = 0; i < n; i++) {if (nums[i] > 0)// 小优化,如果第一个数都大于零了,就不可能有成立的三元组了break;                           if (i > 0 && nums[i] == nums[i - 1]) // 去重i{continue;//本来应该是i++的,但是熟悉语法就可以用continue去重}int right = n - 1;int left = i + 1;//双指针while (left < right) {int sum = nums[i] + nums[left] + nums[right];if (sum < 0) {left++;} else if (sum > 0) {right--;} else {ret.push_back({nums[i], nums[left], nums[right]}); // 语法while (left < right &&nums[left] == nums[left + 1]) // 实现去重,避免越界{left++;}while (left < right &&nums[right] == nums[right - 1]) // 实现去重,避免越界{right--;}left++;right--; // 找下一个,不漏掉全部情况}}}return ret;}
};

细节:

这里我们演示一些细节问题:

1.去重(right,left,i去重):

2.越界的特殊情况:

3.我们需要找到全部符合的三元组,不要遗漏

也就是我们找到一组后,left++,right--找下一组.直到遍历完.

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

相关文章:

  • 鸿蒙开发 一 (九)、嵌套滚动,Scroll + List
  • 【展厅多媒体】互动虚拟翻书技术应用全解析
  • 外贸网站建设定制开发小型办公室中式装修
  • WaveTerminal+cpolar:命令行工具的远程协作新体验
  • 基于C++的分布式RPC框架(一)
  • 【有源码】基于Hadoop+Spark的AI就业影响数据分析与可视化系统-AI驱动下的就业市场变迁数据分析与可视化研究-基于大数据的AI就业趋势分析可视化平台
  • 爆炸特效:Unity+Blender-02-火焰
  • 设计模式-结构性设计模式(针对类与对象的组织结构)
  • STM32--大功率mos管驱动模块
  • 中国铁路监理建设协会网站济南网站建设公司
  • 解析UART空闲中断与DMA接收机制
  • 重庆网站建设百度推广wordpress 随机一句话
  • 企业数据采集实战(二):设备多样性与异构性问题的挑战
  • Android Handler源码阅读
  • JavaWeb项目部署02(Docker)
  • VMware+RockyLinux+ikuai+docker+cri-docker+k8s+calico BGP网络 自用 实践笔记(底稿)
  • 意力机制 | 添加Deformable-LKA可变形大核注意力
  • Android Automotive OS架构
  • 企业网站访问量的第一来源是( )上海兼职网站制作
  • 《AI协同开发深潜:从架构迷雾到系统澄明的实战路径》
  • 专业的营销型网站建设企业方案项目策划书怎么写
  • 光环状态类型释义
  • Doris数据库-常用功能
  • MySQL中的空间碎片率计算分析
  • Python爬虫实战:获取东方财富网游戏板块数据与市场趋势分析
  • 【深度学习计算机视觉】07:单发多框检测(SSD)
  • 提取网站子页面邮箱文化馆建设网站
  • 大数据安全解决方案(PPT)
  • AI大模型学习(14)AI 小白入门!用 OpenCV+Python 打造人体姿态识别系统,超详细教程来了
  • 使用 Azure AD 实现认证与权限管理:原理解析与操作指南