力扣hot100:1.两数之和(哈希表)

输入中可能存在重复值 。

分析:

        本题需要返回的是数组下标,因此如果需要使用排序然后双指针的话,需要用到哈希表,但是由于输入中可能存在重复值,因此哈希表的value值必须是vector<int>。

        使用双指针求目标值target,利用的是数值大小关系,需要对数组进行排序。

然而原数组下标是答案的话,我们单纯排序是解决不了的。

        这里使用一个类似动态规划的哈希表。

一、一层循环+哈希表

一般想法:第一层循环确定一个数nums[i],判断target-nums[i]是否存在,即看所有数 或者 后面的数中存不存在这样的一个数。但是由于数有重复,可能导致一次性做不了。

高级想法:

        定义一个集合dp[i],表示包含前i-1个数的集合。第一层循环确定一个数nums[i],判断target-nums[i]是否存在,只需要看dp[i]中是否存在这样的一个数,这样做不具有后效性。

(如果答案是(i,j)j>i,则当判断到j时,nums[i] 一定在dp[j]中,可以找到答案。)

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int,int> Hash;for(int i=0;i<nums.size();++i){int temp=target-nums[i];if(Hash.find(temp)!=Hash.end()){return {i,Hash[temp]};}Hash[nums[i]]=i;}return {};}
};

二、扫一遍+挨个看

先扫描一遍,把所有数对应的不同下标存下来,然后一个数一个数看,是否存在他的配偶。(这个时候排序双指针也是可以的)

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int,vector<int> > Hash;for(int i=0;i<nums.size();++i){if(Hash.find(nums[i])==Hash.end()){Hash[nums[i]]={i};}else Hash[nums[i]].push_back(i);}for(int i=0;i<nums.size();++i){if(Hash.find(target-nums[i])!=Hash.end()){if(target!=2*nums[i]||Hash[target-nums[i]].size()==2)if(target==2*nums[i]){return Hash[nums[i]];}else{return {i,Hash[target-nums[i]][0]};}}}return {};}
};

总体来说第二种做法会比较蠢,用形象的例子来看:

假如有n个人排好队,其中只有一对人是同年同月同日生的,请找出这俩人。(当然这里值相等只需要存入一个哈希表,然后遍历哈希表看个数即可,但是为了说明问题请不要这样想。)

第一种方法:从第一个人开始,边看边记录,每次问一个人的生日之后,用其生日看看之前记录的人有没有和ta同年同月同日生的人,一直往后看,一定能看到。如果有多对人是同年同月同日生,也一定能发现。(用哈希表使得这个记录用O(1)就能查到需要查的人是否存在)。

第二种方法:先将所有人记录下来,然后再一个一个人看是否有和ta同年同月同日生的,还需要避免选出来的人就是同一个人。

两个方法都是O(n)的,只是第一个聪明一些,好写一些。

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

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

相关文章

第十七天-反爬与反反爬-验证码识别

目录 反爬虫介绍 基于身份识别反爬和解决思路 Headers反爬-使用User-agent Headers反爬-使用coookie字段 Headers反爬-使用Referer字段 基于参数反爬 验证码反爬 1.验证码介绍 2.验证码分类&#xff1a; 3.验证码作用 4.处理方案 5.图片识别引擎:ocr 6.使用打码平…

基于springboot+vue的周边游平台个人管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

【leetcode】三数之和 双指针

/*** param {number[]} nums* return {number[][]}*/ var threeSum function(nums) {nums.sort((a,b)>a-b);let result[];for(let i0;i<nums.length-2;i){if(nums[i]>0) return result;//因为求三数之和等于0&#xff0c;如果第一个数已经大于0&#xff0c;后面肯定无…

pycharm社区版+miniconda 环境配置学习

使用电脑为win10 64bit 一、下载&#xff1a; 1.pycharm社区版地址&#xff1a; 其他版本 - PyCharm 2.miniconda下载地址&#xff1a; Index of /anaconda/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 3.python下载地址&#xff1a; https://www.python.or…

云原生数据库 GaiaDB 支持新的管理工具啦

GaiaDB 是百度智能云自研的新一代企业级关系型数据库&#xff0c;最大容量可扩展 500TB 以上&#xff0c;吞吐达到 150 万以上 QPS。 作为一款 100% 兼容 MySQL 的云原生数据库产品&#xff0c;用户可以通过多种客户端工具连接 GaiaDB 实例&#xff0c;例如 MySQL Workbench、N…

【机器学习】生成对抗网络GAN

概述 生成对抗网络&#xff08;Generative Adversarial Network&#xff0c;GAN&#xff09;是一种深度学习模型架构&#xff0c;由生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;两部分组成&#xff0c;旨在通过对抗训练的方式生成逼…

Python之Web开发初学者教程----卸载ubuntu系统

Python之Web开发初学者教程----卸载ubuntu系统 Windows 10自带了Subsytem for Linux (WSL)功能&#xff0c;可以让用户在Windows命令行环境下运行Linux命令。用户可以在Windows应用商店中下载和安装Ubuntu子系统&#xff0c;有时在使用过程中需要完全删除Ubuntu子系统以释放硬…

Unity编写Shader内置各种矩阵和方法介绍

嗨&#xff0c;各位小伙伴们&#xff0c;我是你们的好朋友咕噜铁蛋&#xff01;今天&#xff0c;我们要来聊一聊关于Unity中编写Shader时内置的各种矩阵和方法。作为Unity开发者&#xff0c;掌握Shader编写是非常重要的一项技能&#xff0c;而了解内置的矩阵和方法将帮助我们更…

手写分布式配置中心(二)实现分布式配置中心的简单版本

这一篇文章比较简单&#xff0c;就是一个增删改查的服务端和一个获取配置的客户端&#xff0c;旨在搭建一个简单的配置中心架构&#xff0c;代码在 https://gitee.com/summer-cat001/config-center 服务端 服务端选择用springboot 2.7.14搭建&#xff0c;设计了4个接口/confi…

2核4G服务器支持多少人在线?腾讯云全访问测试

腾讯云轻量应用服务器2核4G5M配置一年优惠价165元、252元15个月、三年756元&#xff0c;100%CPU性能&#xff0c;5M带宽下载速度640KB/秒&#xff0c;60GB SSD系统盘&#xff0c;月流量500GB&#xff0c;折合每天16.6GB流量&#xff0c;超出月流量包的流量按照0.8元每GB的价格支…

linux中对信号的认识

信号的概念与相关知识认识 信号是向目标进程发送消息通知的的一种机制。 信号可以以异步的方式发送给进程&#xff0c;也就是说&#xff0c;进程无需主动等待&#xff0c;而是在任何时间都可以接收到信号。 信号的种类 用kill-l命令查看系统定义的信号列表&#xff1a; 前台…

@ConfigurationProperties替换@value实现外部属性的注入

任务&#xff1a;使用ConfigurationProperties替换value实现外部属性的注入&#xff0c;不用再使用Value一个一个注入了&#xff0c;实现批量注入。 1、首先我们看一下yml配置信息&#xff1a;我们需要将aliyun这四个变量读取到别的方法中进行上传图片至aliyun的功能&#xff…

【C语言】linux内核packet_setsockopt

一、中文注释 // 发送数据包函数。它尝试通过特定的网络设备队列直接传输一个skb&#xff08;socket缓冲区&#xff09;。 static int packet_direct_xmit(struct sk_buff *skb) {return dev_direct_xmit(skb, packet_pick_tx_queue(skb)); // 调用dev_direct_xmit函数&#x…

redis7.2.2|SkipList源码解析,源码面前了无秘密

本篇文章基于redis7.22 源码位置&#xff1a;redis-7.2.2\src\t_zset.c 有关skiplist的介绍可以参考&#xff1a;skiplist 文章目录 ZsetzsetData_Structzskiplist FunctionzslCreateNodezslCreatezslFreeNodezslFreezslRandomLevelzslInsertzslDeleteNodezslDeletezslGetRankz…

Netty源码剖析——启动过程源码剖析(二十六)

指南 在 io.netty.example 包下&#xff0c;有很多Netty源码案例&#xff0c;比较适合分析 Netty启动过程源码剖析 源码需要剖析到Netty调用doBind()&#xff0c;追踪到NioServerSocketChannel的doBind()。并且要Debug程序到NioEventLoop类的run()&#xff0c;无限循环&#xf…

【Java】嚼烂基础之抽象类

文章目录 前言一、抽象类1.1抽象类概念1.2抽象类语法1.3抽象类特性1.4抽象类的作用 结语 前言 在之前我们对Java的继承与多态特性进行了一定的了解&#xff0c;今天我们来继续深入学习内容——抽象类。本篇文章将详细介绍Java语言中的抽象类abstract的概念、语法、特性与作用&…

重庆有哪些媒体资源?活动展会媒体邀约

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 重庆作为中国的一个直辖市&#xff0c;拥有丰富的媒体资源&#xff0c;涵盖电视台、广播电台、报纸、杂志以及网络媒体等各个领域。这些媒体不仅是传播新闻和信息的重要渠道&#xff0c;…

【C语言】【洛谷】P1125笨小猴

一、个人解答 #include<stdio.h> #include<string.h>int prime(int num);int main() {char max a, min z;int maxn0, minn1000;char str[100];int num[26] { 0 };fgets(str, sizeof(str), stdin);str[strcspn(str, "\n")] \0;for (int i 0; str[i]…

当父母被健康谣言包围,除了吐槽我们还能做什么?

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 父母健康舒心是我们的福报&#xff0c;希望本期节目能让大家重视潜移默化的力量。小时候父母是我们心中无所不能的超级英雄。长大后的我…

《数字图像处理(MATLAB版)》相关算法代码及其分析(3)

目录 1 对边界进行子采样 1.1 输入参数检查 1.2 处理重复坐标 1.3 计算边界最大范围 1.4 确定网格线数量 1.5 构建网格位置向量 1.6 计算曼哈顿距离 1.7 整理输出结果 1.8 返回结果 2 改变图像的存储类别 2.1 函数输入 2.2 数据类型转换 2.3 错误处理 2.4 返回结…