力扣hot100:15.三数之和(双指针/哈希表)

分析:
三数和问题,这里和两数之和不一样,返回的是值,因此可以对其进行排序,使用双指针。
一、一层循环+双指针

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(),nums.end());vector<vector<int>> ans;for(int i=0;i<nums.size()-2;++i){if(nums[i]>0) break;if(i>0&&nums[i]==nums[i-1]) continue;int right=nums.size()-1;int target=-nums[i];for(int left=i+1;left<right;++left){if(left>i+1&&nums[left]==nums[left-1]) continue;while(left<right&&nums[left]+nums[right]>target) --right;if(left!=right)if(nums[left]+nums[right]==target) ans.push_back({nums[i],nums[left],nums[right]});}}return ans;}
};
二、一层循环+扫一遍的哈希表
为了避免第一层循环不必要的重复值,需要进行排序。
无脑往集合里塞,然后使用集合去重。(由于是全局的哈希表,因此(i,j)和(j,i)都会被放入,会有重复)。
这里的基本思路是,塞入的时候只需要看数量多少即可,比如3+3+3=9,那是否真正存在3 个3呢,只有两个3是不行的。
时间复杂度:O(n²+klogk+3klog3)

class Solution {
public:void Insert(set<vector<int>> &ans ,int &a,int & b,int &c){vector<int> temp={a,b,c};sort(temp.begin(),temp.end());ans.insert(temp);return;}vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(),nums.end());set<vector<int>> ans;unordered_map<int,int> hash;for(int i=0;i<nums.size();++i){if(hash.find(nums[i])==hash.end()){hash[nums[i]]=1;}else{hash[nums[i]]+=1;}}for(int i=0;i<nums.size()-2;++i){if(nums[i]>0) break;if(i>0&&nums[i]==nums[i-1]) continue;for(int j=i+1;j<nums.size()-1;++j){if(j>i+1&&nums[j]==nums[j-1]) continue;int cur=-nums[i]-nums[j];if(hash.find(cur)!=hash.end()){if(cur==nums[i]||cur==nums[j]){if(nums[i]==nums[j]){if(hash[nums[i]]>2) Insert(ans,nums[i],nums[j],cur);}else{if(cur==nums[i]){if(hash[nums[i]]>1) Insert(ans,nums[i],nums[j],cur);}else{if(hash[nums[j]]>1) Insert(ans,nums[i],nums[j],cur);}}}else Insert(ans,nums[i],nums[j],cur);}}}vector<vector<int>> result;for(auto it=ans.begin();it!=ans.end();++it){result.emplace_back(*it);}return result;}
};
三、一层循环+问一遍
对比一下:力扣hot100:1.两数之和-CSDN博客
这里问一遍的开销更大了,因为每次问都得重开一个集合。清空集合或销毁集合一共O(K)(K是不同元素的个数)。(两数和只需要一个集合,没常数级别的判断所以更快)
而扫一遍却只需要一个集合,用常数级别判断。
思路:第一层循环确定一个数i,第二层循环 从之后的数开始 从前往后遍历,每次遍历时如果这个数j 和 之前存入集合的数 可以构成一个可行解,则将结果保存起来,并且这个情况下,这个数j和它对应的另外一个数 对于数i而言都不能再出现在结果中,不然会存在重复(确定两个另外一个必然唯一确定)。因此当这个数j被存入结果中时,下次我们既要 从 与这个数不同的数 开始考虑(避免选定同样的两个数),也不需要把这个数j存入集合(可以存但无意义,之和不会再考虑它)。

清空set,而不是销毁set(Set.clear()),速度更快:

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(),nums.end());vector<vector<int>> res;for(int i=0;i<nums.size()-2;i++){if(nums[i]>0) break;//减少不必要的判断if(i>0 && nums[i]==nums[i-1]){continue;}unordered_set<int> Set;//每次创建一个Set,用完这次销毁。int target=-nums[i];for(int j=i+1;j<nums.size();j++){int temp=target-nums[j];if(Set.find(temp)!=Set.end()){res.push_back({nums[i],nums[j],temp});while(j<nums.size()-1&&nums[j]==nums[j+1]) ++j;}else{//else 非必要。此时nums[j]可以被存,因为temp<nums[j],因此nums[j]在后面永远不会被再次考虑,存了也不影响结果Set.insert(nums[j]);}}}return res;}
};
相关文章:
力扣hot100:15.三数之和(双指针/哈希表)
分析: 三数和问题,这里和两数之和不一样,返回的是值,因此可以对其进行排序,使用双指针。 一、一层循环双指针 class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {sort…...
VMware虚拟机使用Windows共享的文件夹
虚拟机版本为 VMware Workstation 16 Pro:16.2.4;主机位Windows11;记录于2024-03-05 在个人使用时,经常会有一些数据集等大文件重复在不同实验中使用,但是不同系统中来回使用会导致占用虚拟机空间,该博文通过将主机…...
利用Python自动化日常任务
在快节奏的现代生活中,时间就是一切。幸运的是,Python提供了一系列强大的库和工具,可以帮助我们自动化那些乏味且重复的任务,从而释放我们的时间,让我们可以专注于更有创造性和有意义的工作。下面,我们将探…...
Android的多线程和异步处理
在Android开发中,多线程和异步处理是处理耗时操作、提高应用响应性和性能的关键技术。以下是一些关于Android多线程和异步处理的基本概念和实践: 1. **主线程(UI线程)**: - Android应用的主线程负责处理UI操作和事…...
MySQL-----视图
一 视图 ▶ 介绍 视图view是一个虚拟表,非真实存在,其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用视图名称即可获取结果集,并可以将其当作表来使用。 数据库中存放了视图的定义&…...
LeetCode-02
225. 用队列实现栈 用两个队列实现栈的功能,思路如下: 往空队列中放新元素把非空队列中的元素依次放入刚才添加了新元素的队列,直到非空队列变为空队列 class MyStack(object):def __init__(self):self.queue1 []self.queue2 []def push(…...
瑞_Redis_Redis的Java客户端
文章目录 1 Redis的Java客户端1.1 Jedis快速入门1.1.1 入门案例1.1.1.1 项目构建1.1.1.2 引入依赖1.1.1.3 建立连接1.1.1.4 释放资源1.1.1.5 测试1.1.1.6 完整测试类代码 1.1.2 Jedis连接池1.1.2.1 连接池工具类1.1.2.2 改造原始代码 1.2 SpringDataRedis1.2.1 RedisTemplate1.…...
Cmake的使用
第一步:安装Cmake 双击点开即可,无脑下一步。 第二步:编写一个简单的Cmake项目 CMakeLists.txt文件 # 设置最低的 CMake 版本要求 cmake_minimum_required(VERSION 3.10)# 设置项目名称 project(MyProject)# 添加可执行文件 add_executabl…...
linux系统ELK组件介绍
ELK组件介绍 ELK组件介绍Elasticsearch:Logstash:Kibana:Kafka: Filebeat: ELK 官网地址:https://www.elastic.co 官网搭建:https://www.elastic.co/guide/index.html 组件介绍 Elasticsearch: 是一个基于Lucene的搜…...
回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测
回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测 目录 回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BiTCN基于双向时间卷积网络的数据回归预测(完整源码和数据&a…...
Tailscale中继服务derper使用docker-compose部署
docker启动 docker run --restart always \--name derper -p 12345:12345 -p 3478:3478/udp \-v /root/.acme.sh/xxxx/:/app/certs \-e DERP_CERT_MODEmanual \-e DERP_ADDR12345 \-e DERP_DOMAINxxxx \-d ghcr.io/yangchuansheng/derper:latestdocker-compose启动 version: …...
Spring Cloud 实战系列之 Zuul 微服务网关搭建及配置
一、创建SpringBoot项目 用mavan搭建也可以。(重要的是后面pom里应该引入那些依赖,application.yml怎么配置) 由于开始构建项目时选择了Eureka Server,所以pom.xml中不需要手动添加依赖了 首先在启动类SpringcloudApplicatio…...
【数据结构】队列
前言: 本节博客是对基础数据结构队列的一种实现思路的分享,有需要借鉴即可。 1.队列的概念 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先 进先出FIFO(First In First Out) 入…...
学习JAVA的第十三天(基础)
目录 API之Arrays 将数组变成字符串 二分查找法查找元素 拷贝数组 填充数组 排序数组 Lambda表达式 集合的进阶 单列集合 体系结构 Collection API之Arrays 操作数组的工具类 将数组变成字符串 //将数组变成字符串char[] arr {a,b,c,d,e};System.out.println(Arra…...
C++--机器人的运动范围
目录 1. 题目 2. 思路 3. C代码测试 4. 测试结果 1. 题目 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格…...
深度学习API——keras初学
keras定义相关概念: Keras是一个深度学习API,使用Python语言编写的github开源项目,主要开发者为谷歌工程师。Keras底层可调用不同的机器学习平台,如TensorFlow、Theano或micsoft-CNTK。 作用:keras主要功能是简化机器…...
Web APIs知识点讲解(阶段二)
DOM-事件基础 一.事件 1.事件 目标:能够给 DOM元素添加事件监听 事件:事件是在编程时系统内发生的动作或者发生的事情,比如用户在网页上单击一个按钮 事件监听:就是让程序检测是否有事件产生,一旦有事件触发,就立即调用一个函…...
多平台拼音输入法软件的开发
拼音输入法从上个世纪发展到现在, 已经发展了几十年了, 技术上已经非常成熟了. 换句话说, 就是实际上没多少技术含量, 随便来个人就能手搓一个. 本文介绍一个简单的多平台拼音输入法软件的设计和实现, 支持 GNU/Linux (ibus) 平台 (PC) 和 Android 平台 (手机). 目录 1 中文输…...
Flutter学习7 - Dart 泛型
1、泛型类 //泛型类 class Cache<T> {final Map<String, T> _cache {};void saveData(String key, T value) {_cache[key] value;}//泛型方法T? getData(String key) {return _cache[key];} }void main() {Cache<int> cache1 Cache();const String name…...
Git 基本操作 ⼯作区、暂存区、版本库
创建本地仓库: 创建 Git 本地仓库 要提前说的是,仓库是进行版本控制的⼀个文件目录。我们要想对文件进行版本控制,就必须先创建⼀个仓库出来。 首先touch 一个文件: 初始化仓库: 创建完成后,我们会发现当前…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
