15三数之和

news/2025/1/14 21:19:19/文章来源:https://www.cnblogs.com/gqzz/p/18669501

自己的思路是将解的情况分类:只有三种情况 (正,0,负),(正,正,负),(负,负,正)。
将nums分为两个数组pos,保存正数;neg,保存负数。
当两个数组的长度小于nums的长度时说明存在0,这个时候利用哈希的方法可以找到第一种情况的所有解;
对于第二种情况,构建set:possum,保存两个不同正数的和,然后利用哈希的方法去neg中寻找;
第三种情况和第二种类似。
判题的时候发现这样无法处理:全0,会直接输出为空、有重复的正数或负数,会出现重复的元组。
看解析
哈希的方法是自己想复杂了,构建两轮循环确定a,b,然后哈希寻找-a-b就可以了,难点也确实就在于去重
然后是双指针的方法

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> res;sort(nums.begin(), nums.end() );for(int i = 0; i < nums.size(); ++i ){if( nums[i] > 0 )return res;//上一轮成立的解的下标是 i-1,left, right//, 因此如果这一轮的nums{i] 和nums[i-1]相等就要去重if(i > 0 && nums[i] == nums[i-1])continue;//这里指针的初始化也要注意,起始三元组是 最小负数(i),第二小负数(left),最大正数(right)//这样就保证了每次left和right的移动都有可能找到潜在的解//通过三个指针的移动来保证所有的三元组都能搜索到int left = i + 1;int right = nums.size() - 1;while(left < right){if( nums[i] + nums[left] + nums[right] < 0 )//当前三元组的和偏小,需要增大负数left++;else if ( nums[i] + nums[left] + nums[right] > 0 )//当前三元组的和偏大,需要减小正数right--;else {res.push_back( vector<int> {nums[i], nums[left], nums[right]} );//只有等于0的解才需要去重//去重,当前符合要求的解是i,left,right,因此要比较下一次可能移动到的位置while( left < right && nums[right-1] == nums[right] ) right--;while( left < right && nums[left+1] == nums[left] ) //去重left++;//由于此时是一组和为0的解,因此为了寻找下一组可能的解,left和right必须都要移动right--;left++;//只要当得到一组新的三元组,即不出现重复时,才重新开始判断}} }return res;}
};

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

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

相关文章

not_the_same_3dsctf_2016 1

打开ida能看到栈溢出,返回地址填到get_secret函数里面,可以看到get_secret函数是直接读取了flag的,现在就需要把它输出即可。 输出我们可以利用代码里面的printf,因为printf从缓冲区打印出东西需要满足条件,比如有换行符或缓冲区已满或程序正常退出。 这里我们用exit让程序…

JS-35 数组方法_reverse()

reverse方法用于颠倒排列数组元素,返回改变后的数组。注意,该方法将改变原数组 var a =[a,b,c]; a.reverse()//["c","b","a"];

FastGPT及大模型API(Docker)私有化部署指南

本文提供了FastGPT及其相关大模型API的Docker私有化部署指南,旨在简化部署流程并降低设备配置要求。文章重点介绍了优化后的部署配置、推荐使用的部署容器以及部署步骤,确保用户能够在不影响FastGPT功能的前提下,以高效的资源利用实现快速部署。1. **部署优化**:本文首先指…

LCT

1 概述 首先我们需要知道一类问题,在这类问题中我们需要维护一个森林,支持加边和删边操作,然后要求维护树上的一些信息。这类问题称为动态树问题。 而 LCT,即 Link-Cut Tree,就是用于解决动态树问题的一种数据结构。 学习 LCT 之前需要对 Splay 这种平衡树有一定了解,当然…

git整体使用流程

一、场景说明本地有文件 想在github创建一个远程仓库 在本地修改,同时同步到远端二、流程设置用户名和邮箱目的:标识每次提交者的身份 设置全局用户名:git config --global user.name "Your Name" 设置全局邮箱:git config --global user.email "your.email…

【Linux性能】Linux 下利用 Valgrind 进行内存调试

一、概述 Valgrind 是一个开源的内存调试和性能分析工具,用于帮助开发者找出程序中的内存错误,如内存泄漏、使用未初始化的内存、非法内存访问等问题。它在 Linux 平台上广泛使用,并且支持下多种处理器架构。 二、Valgrind 的使用 2.1 基本格式 valgrind --tool=memcheck -–…

C#/.NET/.NET Core技术前沿周刊 | 第 21 期(2025年1.6-1.12)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿、推荐或自荐优质文章、项目、学习资源等…

26. 文件操作

一、数据读写在 PySide6 中对文件和文件夹的进行操作时,主要使用 QFile 类、QFileInfo 类和 QDir 类。我们可以在终端中使用 pip 安装 pyside6 模块。 pip install pyside6在 PySide6 窗口程序对文件或者文件夹进行操作时,不强制要求必须使用 PySide6 中提供的 QFile、QDir 等…

MySQL基础函数使用

DQL中的函数 # 官方函数链接 https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format4.1 单行函数函数都是数据库提前给我们准备好的,所以我们可以直接调用,使用函数可以让指定的列计算出我们需要的数据 单行函数 : 指的是操作一行数据…

【模拟电子技术】06-双极晶体管的结构与放大原理

【模拟电子技术】06-双极晶体管的结构与放大原理图(b)中我们可以看到三个区的分类,发射区之所以为发射区是因为掺杂浓度高,才能发射电子出去。而集电区掺杂浓度低,就好比我们想让一个房间当作仓库,那么它的空间肯定要大,里面原本不能是放了很多东西。下图NPN晶体管中发射…

地平线Vision Mamba:超越ViT,最具潜力的下一代通用视觉主干网络

• Vision Mamba 论文链接: https://arxiv.org/abs/2401.09417 • 项目主页: https://github.com/hustvl/Vim 简介 本文的工作Vision Mamba[1]发表在ICML 2024。研究的问题是如何设计新型神经网络来实现高效的视觉表示学习。该任务要求神经网络模型能够在处理高分辨率图像时既…