力扣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.hqwc.cn/news/509311.html

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

相关文章

Ansible setup 模块 该模块主要用于收集信息,是通过调用facts组件来实现的。

目录 作用查看信息验证保存信息验证 作用 该模块主要用于收集信息&#xff0c;是通过调用facts组件来实现的。   facts组件是Ansible用于采集被管机器设备信息的一个功能&#xff0c;我们可以使用setup模块查机器的所有facts信息&#xff0c;可以使用filter来查看指定信息。…

【系统维护】-微软电脑管家官网

以前没注意&#xff0c;最近一次升级后给安装了微软电脑管家&#xff0c;特别是瘦身功能感觉比较好&#xff0c;以前总是装第三方或者用命令行情况&#xff0c;有时候不小心还会给系统搞崩溃。感觉这个会安全很多。 还有其他一些功能&#xff0c;建议感兴趣的的可以试一下&…

Axure导入使用ElementUI组件库

在使用Axure进行UI设计时&#xff0c;我们可能导入ElementUI组件库或者一些其他的元件库&#xff0c;其实非常简单&#xff0c;如果你还没有装好Axure可以先安装好AxureRP9汉化版&#xff0c;接下来&#xff0c;我们以AxureRP9汉化版来演示如何导入ElementUI组件库。 第一步&a…

CMake 生成器

关于 CMake 的讨论已有不少&#xff0c;因为 CMake 无疑是一个伟大的工具。如果你搜索“CMake”&#xff0c;你肯定会看到这样一句话&#xff1a;“CMake 不是一个构建系统&#xff0c;而是一个构建系统生成器”。因此&#xff0c;本篇文章的内容主要围绕什么是 CMake 生成器&a…

低代码开发平台优势揭秘 | 提升应用程序开发效率

低代码开发平台是指不用编码或少量编码即可快速产生应用程序的开发平台。依据平台的可视化开发方式&#xff0c;具有不同经验水准的开发者能通过图型操作面板、系统软件拖拽组件和模型驱动思维创建网页和移动应用程序。低代码开发平台在如今企业数字化的蓬勃发展中发挥着不可替…

【Leetcode每日一题】DP35 二维前缀和(难度⭐⭐)(26)

1. 题目解析 题目链接&#xff1a;DP35 【模板】二维前缀和 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 核心在于计算题目所给二维区间数组元素和返回即可。 2. 算法原理 和上题了类似的方法&#xff0c;使用dp数组来保存[1…

智慧公厕:打造智慧城市的环卫明珠

在城市建设中&#xff0c;公共卫生设施的完善和智能化一直是重要环节。而智慧公厕作为智慧城市建设的重要组成部分&#xff0c;发挥着不可替代的作用。本文以智慧公厕源头实力厂家广州中期科技有限公司&#xff0c;大量精品案例现场实景实图&#xff0c;解读智慧公厕如何助力打…

风险评估是什么意思?与等保测评有什么区别?

最近看到不少小伙伴在问&#xff0c;风险评估是什么意思&#xff1f;与等保测评有什么区别&#xff1f;这里我们就来简单聊聊。 风险评估是什么意思&#xff1f; 风险评估是指对某个特定领域或项目进行全面分析和评估&#xff0c;以确定可能存在的潜在风险和危害&#xff0c;并…

Vue-02

开发者工具 安装插件&#xff0c;用于调试 Vue 应用。 https://chrome.zzzmh.cn/index 搜索 Vue &#xff0c;下载 Vue.js Devtools &#xff0c;此插件可以帮助更新信息&#xff0c;而不通过控制台更新&#xff0c;更方便调试。 注&#xff1a;安装插件后&#xff0c;记得在插…

【仿真基本功】【PyTorch】从头安装PyTorch(GPU版本)【2024/03/03更新】

【仿真基本功】【PyTorch】从头安装PyTorch&#xff08;GPU版本&#xff09;【2024/03/03更新】 安装步骤1. 安装Anaconda2. 查看显卡对CUDA版本的支持3. 查看PyTorch的安装需求4. 安装PyTorcha) 配置新环境b) 进入新环境c) 按照CUDA版本要求&#xff0c;必须小于等于显卡支持的…

MyBatis操作数据库(注解方式)

MyBatis是一个持久层框架&#xff0c;和Spring没有任何关系&#xff0c;可以用来简化数据库的操作&#xff01; 创建工作&#xff1a; 创建Spring Boot工程&#xff0c;并导入MyBatis的起步依赖&#xff0c;Mysql的依赖等 配置数据库&#xff1a; #配置数据库的连接字符串 s…

demo型xss初级靶场

一、环境 XSS Game - Ma Spaghet! | PwnFunction 二、开始闯关 第一关 看看代码 试一下直接写 明显进来了为什么不执行看看官方文档吧 你不执行那我就更改单标签去使用呗 ?somebody<img%20src1%20onerror"alert(1)"> 防御&#xff1a; innerText 第二关…