LeetCode 15. 三数之和 思考分析(双指针解)

目录

  • 初解:未考虑去重
  • 二解:未考虑去重位置
  • 三解:AC

题目:
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

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

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

初解:未考虑去重

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;//对nums排序sort(nums.begin(), nums.end());int n = nums.size();for(int i=0;i<n;i++){//使用双指针法,不过得先确定一个数(因为是3个数),这里我们确定第一个数//如果第一个数>0,因为是递增的,所以之后的序列相加必定大于0if(nums[i] > 0) return result;//接下来是去除重复元素if(i>0 && nums[i]==nums[i-1]) continue;//接下来就是双指针操作int left = i+1;int right = n-1;while(left < right){int sum = nums[i] +nums[left] + nums[right];if(sum > 0){//说明right太大right--;}else if(sum < 0){//说明left太小left++;}else{result.emplace_back(vector<int>{nums[i],nums[left],nums[right]});//找到元素之后,left++,right--(为什么right--?因为nums[i],nums[left],nums[right]==0,//此时left++,且由于递增,nums[left++]>nums[left],为了能够再次找到sum==0的数对,nums[new_right]必须//小于nums[old_right])left++;right--;}}}return result;}
};

在这里插入图片描述

二解:未考虑去重位置

一开始的去重只考虑到了三个数中的第一个,其实在双指针left、right移动中也会产生重复元素,我们要进行去除。

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;//对nums排序sort(nums.begin(), nums.end());int n = nums.size();for(int i=0;i<n;i++){//使用双指针法,不过得先确定一个数(因为是3个数),这里我们确定第一个数//如果第一个数>0,因为是递增的,所以之后的序列相加必定大于0if(nums[i] > 0) return result;//接下来是去除重复元素if(i>0 && nums[i]==nums[i-1]) continue;//接下来就是双指针操作int left = i+1;int right = n-1;while(left < right){int sum = nums[i] +nums[left] + nums[right];//left去重往右靠while(left < right && nums[left]==nums[left+1]) left++;//right去重往左靠while(left < right && nums[right]==nums[right-1]) right--;if(sum > 0){//说明right太大right--;}else if(sum < 0){//说明left太小left++;}else{result.emplace_back(vector<int>{nums[i],nums[left],nums[right]});//找到元素之后,left++,right--(为什么right--?因为nums[i],nums[left],nums[right]==0,//此时left++,且由于递增,nums[left++]>nums[left],为了能够再次找到sum==0的数对,nums[new_right]必须//小于nums[old_right])left++;right--;}}}return result;}
};

加入去重之后发现:去重将一些可能的答案去除了。所以去重要放在完成一组答案之后
在这里插入图片描述

注意去重只能放在完成一组答案之后、下标移动之前,因为只有去重之后才能保证,下面的nums[left++]>nums[left]和nums[new_right]小于nums[old_right])

三解:AC

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;//对nums排序sort(nums.begin(), nums.end());int n = nums.size();for(int i=0;i<n;i++){//使用双指针法,不过得先确定一个数(因为是3个数),这里我们确定第一个数//如果第一个数>0,因为是递增的,所以之后的序列相加必定大于0if(nums[i] > 0) return result;//接下来是去除重复元素if(i>0 && nums[i]==nums[i-1]) continue;//接下来就是双指针操作int left = i+1;int right = n-1;while(left < right){int sum = nums[i] +nums[left] + nums[right];if(sum > 0){//说明right太大right--;}else if(sum < 0){//说明left太小left++;}else{result.emplace_back(vector<int>{nums[i],nums[left],nums[right]});//注意去重只能放在完成一组答案之后、下标移动之前,因为只有去重之后才能保证,下面的nums[left++]>nums[left]和nums[new_right]小于nums[old_right])//left去重往右靠while(left < right && nums[left]==nums[left+1]) left++;//right去重往左靠while(left < right && nums[right]==nums[right-1]) right--;//找到元素之后,left++,right--(为什么right--?因为nums[i],nums[left],nums[right]==0,//此时left++,且由于递增,nums[left++]>nums[left],为了能够再次找到sum==0的数对,nums[new_right]必须//小于nums[old_right])left++;right--;}}}return result;}
};

效果:
在这里插入图片描述

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

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

相关文章

十、非规则组织分析及其数学模型——锯齿形斜纹组织

锯齿形斜纹组织图&#xff1a; 分析&#xff1a; 前半齿长度k&#xff0c;表示山谷到山峰的列数&#xff0c;也就是锯齿的宽度&#xff1b; 锯齿飞数s&#xff0c;表示山峰到山峰的行数&#xff0c;也就是锯齿的高度。 起始点相差4格&#xff0c;也就是第一部分整体向上移动…

Linq lamdba GroupJoin外连接示例

其实用from..Linq语句做外连接简单而且便于理解&#xff0c;我个人使用lamdba纯粹是技术上的追求吧 DataTable exceldtnew DataTable();DataTable nomacdtnew DataTable();exceldt exceldt.AsEnumerable().GroupJoin(nomacdt.AsEnumerable(), a > a.Field<String>(&q…

ajax为什么有时候不行,为什么不能用ajax调用

Ajax取值时出现未知的运行时错误的解决方法在Ajax里经常会通过innerHTML来改变界面&#xff0c;这个比使用DOM要简单一些。比如&#xff1a;element.innerHTML "put code here"不过&#xff0c;在IE中&#xff0c;有时候会出现"未知的运行时错误(unknown runti…

Java Hashtable size()方法与示例

哈希表类size()方法 (Hashtable Class size() method) size() method is available in java.util package. size()方法在java.util包中可用。 size() method is used to return the number of key-value pairs that exist in this Hashtable. size()方法用于返回此哈希表中存在…

十一、非规则组织分析及其数学模型——芦席斜纹组织

芦席斜纹组织&#xff1a; 该组织是由左斜和右斜有机的结合在一块的&#xff0c;因为其外观酷似芦席故称之为芦席斜纹组织。 织物组织效果&#xff1a; 所需参数&#xff1a; 其基层组织采用双面加强型斜纹&#xff0c;即分子和分母是相同的组织点&#xff0c;例如2上2下(2个经…

LeetCode 18. 四数之和 思考分析(双指针解)

目录需要注意的几点1、去除剪枝操作2、去重操作的细节code以及效果&#xff1a;题目给定一个包含 n 个整数的数组 nums 和一个目标值 target&#xff0c;判断 nums 中是否存在四个元素 a&#xff0c;b&#xff0c;c 和 d &#xff0c;使得 a b c d 的值与 target 相等&#…

图解DotNet框架之一:编译与执行引擎(上)

众所周知,DotNet框架是非常庞大的,光项目创建时的种类就有WPF,WCF,WF这三种最新的技术,还有以前的Web,WinForm,Service,Mobile等等. 这么复杂和庞大的框架,用文字来描述是远远不够的,所以我准备写一系列图文并茂的文章,把我所知道的所有Net框架中的东西全部串联起来,希望可以给…

【Kissy WaterFall】实行手动加载数据

前言&#xff1a;由于Kissy WaterFall默认是监听滚动事件来实现数据动态加载的&#xff0c;但是有一些情况要用到手动加载数据。以下是使用Kissy WaterFall实现手动加载数据的方法。 最终实现效果&#xff1a;点击”逛更多的商店“会动态加载数据 步骤&#xff1a; 当一页数据加…

web服务器文档根目录在哪里,web服务器根目录在哪

web服务器根目录在哪 内容精选换一换SSL证书通过在客户端浏览器和Web服务器之间建立一条SSL安全通道(访问方式为HTTPS)&#xff0c;实现数据信息在客户端和服务器之间的加密传输&#xff0c;可以防止数据信息的泄露。SSL保证了双方传递信息的安全性&#xff0c;而且用户可以通过…

console java_Java Console writer()方法与示例

console java控制台类writer()方法 (Console Class writer() method) writer() method is available in java.io package. writer()方法在java.io包中可用。 writer() method is used to get a distinct PrintWriter object linked with this Console. writer()方法用于获取与此…

二、图片加载与保存

一、基本概念 1&#xff0c;什么是图片&#xff1f; 答&#xff1a;图像是结构化存储的数据信息 2&#xff0c;图像的属性 答&#xff1a;1、通道数目&#xff0c;2、宽与高&#xff0c;3、像素数据&#xff0c;4、图像类型 二、加载显示图像并保存 import cv2 import nump…

LeetCode 206. 反转链表 思考分析

题目 反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题&#xff1f; 迭代双指针 从某公众号&#xff08;代码随想录&#xff09;搬过来的gif图&…

hdu 2846 Repository 字典树的变形

Repository Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)                  Total Submission(s): 1129 Accepted Submission(s): 382 Problem DescriptionWhen you go shopping, you can search in repository…

怎样看虚拟主机的服务器,虚拟主机怎么查看服务器类型

虚拟主机怎么查看服务器类型 内容精选换一换使用华为云提供的公共镜像制作私有镜像时&#xff0c;您需先购买云主机等云资源时镜像选择公共镜像、云服务器类型建议统一选择“s3 (通用计算型)”&#xff0c;在云主机安装部署完商品&#xff0c;然后参照以下方式进行私有镜像制作…

Win32动态库 Lib文件哪去了

最近使用SQLite&#xff0c;用源文件.c和.h编译SQLite的动态库&#xff0c;编译后发现没有Lib文件。 原来&#xff1a;SQLite的.c文件没有引用.h文件&#xff0c;添加引用&#xff0c;编译&#xff0c;Lib文件有了。转载于:https://www.cnblogs.com/yunuoyuhan/p/3204457.html

console java_Java Console format()方法与示例

console java控制台类format()方法 (Console Class format() method) format() method is available in java.io package. format()方法在java.io包中可用。 format() method is used to write the formatted string to this Console with the help of the given string format…

Anaconda自带Python编译器Jupyter Notebook显示代码行数

ESC&#xff1a;进入命令行模式&#xff1b;按下H即可显示各种快捷键信息 Enter&#xff1a;进入编辑模式 方法一&#xff1a;命令方法 一、点击代码段&#xff0c;按ESC&#xff0c;使代码段显示蓝色&#xff0c;进入命令行模式 二、按下ShiftL&#xff0c;显示代码行数 方法…

ajax 服务器响应,ajax-服务器响应

如果需要获得了来自服务器的响应&#xff0c;则使用XMLHttpRequest 对象的 responseText 或 responseXML 属性responseText&#xff1a;获得字符串形式的响应数据&#xff0c;当readyState属性值变为4时&#xff0c;responseText属性才可用&#xff0c;表明Ajax请求已经结束例&…

(转)MOMO的Unity3D研究院之深入理解Unity脚本的执行顺序(六十二)

http://www.xuanyusong.com/archives/2378 Unity是不支持多线程的&#xff0c;也就是说我们必须要在主线程中操作它&#xff0c;可是Unity可以同时创建很多脚本&#xff0c;并且可以分别绑定在不同的游戏对象身上&#xff0c;他们各自都在执行自己的生命周期感觉像是多线程&…

SQL/MongoDB 连接并发测试

最近一直在搞mongodb 文件服务器大量文件并发上传测试&#xff0c;在官方文档发现mongo是线程安全的&#xff0c;支持单一连接下的并发操作。印象ADO.NET 似乎不支持单一连接并发。于是&#xff0c;测试一下来证实这个疑虑。&#xff08;前两篇小记一直纠结mongodb吃内存导致并…