LeetCode - 0001 两数之和

题目地址:https://leetcode.cn/problems/two-sum/description/

:你好,面试官,我对算法了解的不多,只刷过LeetCode第一题,你不要问的太难了,好,我准备好了。

面试官:啊?这?你的胆子很大呀,这也行,真的是初生牛犊不怕虎,好吧,那我就问问你LeetCode第一题,题目如下:

🚀给定一个整数数组 nums 和一个整数目标值 target,需要在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标

当然,你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

示例 :

输入:nums = [2,7,11,15], target = 9

输出:[0,1]

解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

好,题目明白了吗?请开始你的表演🙂


:好的,面试官,题目我明白了,其实这个问题很简单,两个嵌套for循环搞定。外层循环用来遍历数组中的元素,而内层循环则用来与当前元素后面的元素进行比较,为了避免重复计算,我们让外层循环的 i i i 从 0 开始,到 n − 2 n−2 n2 结束(为了确保内层循环 j j j 能取到数),内层循环从 i + 1 i+1 i+1 开始,到 n − 1 n−1 n1 结束。其中时间复杂度为 O ( N 2 ) O(N^2) O(N2)

public int[] twoSum(int[] nums, int target) {int n = nums.length;for (int i = 0; i < n - 1; i++) {for (int j = i + 1; j < n; j++) {//内层循环只遍历i后面的数if (nums[i] + nums[j] == target) {return new int[]{i,j};}}}return new int[]{};
}

面试官:面试官撇了撇嘴,不厌其烦的说,可以嘛,还能够想到内层循环从i+1开始,而不是从0开始。

:我笑了笑,嘿嘿,是的,避免了重复计算。其实…

​ 我正要往下说,面试官打断了我

面试官:但是,你不觉得你这样时间复杂度太高了吗? O ( N 2 ) O(N^2) O(N2),你可以降低它的时间复杂度吗,还有没有其他的解法呢?

:可以的,其实我们想减少时间复杂度,不外乎就是降低其重复的操作,在上面的嵌套循环中,我们可以发现内层循环在遍历 i i i 后面的数时,有的数是被重复扫描了多次的,所以我们可以先把数组遍历一次,把结果先放一边,我们可以用一个哈希表存起来,key为数值,value为数值的下标,第二次遍历的时候再去哈希表里面查找有没有符合条件的数。

​ 一分钟后,我写好了代码

class Solution {public int[] twoSum(int[] nums, int target) {HashMap<Integer, Integer> map = new HashMap();// 遍历一次将数放入mapfor (int i = 0; i < nums.length; i++) {map.put(nums[i], i);}for(int i = 0; i < nums.length;i++){int one = nums[i]; // 第一个数int two = target - one;// 第二个数if(map.containsKey(two)){// 在map中查找是否有数breturn new int[]{i,map.get(two)};}}return new int[]{};}
}

面试官:我看看,咦~~~,确实减少了遍历次数,降低了时间复杂度。哎,不对呀,如果我这里给你数组 n u m s = [ 3 , 2 , 4 , 1 ] nums=[3,2,4,1] nums=[3,2,4,1],目标值target为6,你这个得到的结果是 [ 0 , 0 ] [0,0] [0,0]

:我连忙看了看代码,说到,额,好像是有点问题,这里我们好像在遍历的时候,把当前的数从哈希表中移除掉,于是修改了下第二个循环的代码

for(int i = 0; i < nums.length;i++){int one = nums[i]; // 第一个数int two = target - one;// 第二个数if(map.get(one) == i) map.remove(one);if(map.containsKey(two)){// 在map中查找是否有数tworeturn new int[]{i,map.get(two)};}
}

面试官:嗯,这样就对了

​ 面试官沉默了一会儿

面试官:你看你上面写的代码还要去删除map里面的值,我们可不可以这样,比如我们在遍历数组时,一边遍历,一边将数存入哈希表,比如对于 n u m s [ i ] nums[i] nums[i],这个数,再从哈希表中去找有没有 t a r g e t − n u m s [ i ] target-nums[i] targetnums[i] 这个数,如果没有,再把 n u m s [ i ] nums[i] nums[i] 这个数加入到map中,会不会更好些呢,你想想。

​ 听了面试官的提示,我想了想

:O,好像是可以这么做!

面试官:来,按照这个思路,写下代码呢

:en,好,首先在遍历的时候…,心里面一边嘀咕,一边在纸上写代码

class Solution {public int[] twoSum(int[] nums, int target) {HashMap<Integer, Integer> map = new HashMap();for (int i = 0; i < nums.length; i++) {int one = nums[i]; // 第一个数int two = target - one;// 第二个数if (map.containsKey(two)) {// 在map中查找是否有数tworeturn new int[] { i, map.get(two) };}map.put(one, i);// 找不到再put}return new int[] {};}
}

:写好了,你看看呢

面试官:对对对,这样就避免了我们去删除哈希表的操作,时间复杂度也降到了 O ( N ) O(N) O(N)

​ 此时,面试官的手机铃声响了

面试官:五点半了,下班了,我们该天再面哈😁

:好的,好的,(居然还有这种操作,真的是准时下班)

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

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

相关文章

Spring Boot 调用外部接口的几种方式

Spring Boot 调用外部接口的几种方式 在微服务架构中&#xff0c;服务间的调用是不可或缺的环节。Spring Boot 为开发者提供了多种方式来实现这一任务&#xff0c;这个文章将为你详细介绍这些方式。 一、使用RestTemplate RestTemplate是 Spring Boot 早期版本中常用的 REST 客…

十个最适合论文写作的GPTs及其应用

文章目录 一、GPTs让一切皆有可能二、最适合论文写作的GPTs及其应用1、[Paper Search Engine](https://chat.openai.com/g/g-9v5gHG9Bo)2、[Academic Paper Specialist&#xff08;学术论文撰写专家&#xff09;](https://chat.openai.com/g/g-jryw3pfsH)3、[Paper Connect 论文…

【八十七】【算法分析与设计】单调栈全新版本,右大于,左小于右小于等于,739. 每日温度,907. 子数组的最小值之和

739. 每日温度(右大于) 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 示…

微信公众号接入chatGPT自动回复(2)

微信公众平台 配置自动回复的服务器 application.properties中的配置 验证服务器接口配置 其实就两个接口(相同的url地址,只不过请求方式不一样) 1.验证接口(get请求) 2.自动回复接口(post请求) 完整代码 这个地址就是上面URL配置的地址 如果使用Nginx的话自动配置 将该代…

[原创](Modern C++)现代C++的字符串与Windows API交互的正确方式.

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…

11个免费的 android数据恢复应用程序功能分析

在手机上丢失数据是一个很大的错误。但是&#xff0c;在这种情况下&#xff0c;除了惊慌失措之外&#xff0c;最好开始使用android数据恢复应用程序搜索以查找将其取回的方法。您可以检查手机的备份存储以在Android上进行数据恢复&#xff0c;但是如果数据仍然无处可寻&#xf…

@PostConstruct

PostConstruct initializeBean方法–> PostProcessor.postProcessMergedBeanDefinition --> InitDestroyAnnotationBeanPostProcessor.postProcessBeforeDestruction 被PostConstruct注解的方法会在Bean初始化的时候被调用&#xff0c;如下图&#xff1a; 继承关系如下…

jenkins连接ubuntu普通用户节点

1.创建credentials 2.创建node 3.在jenkins服务器还需要进行的操作&#xff08;jenkins服务器中&#xff09; mkdir /var/lib/jenkins/.ssh ssh-keyscan -H 192.168.110.204 >> /var/lib/jenkins/.ssh/known_hosts chown -R jenkins:jenkins /var/lib/jenkins/.ssh/ 4.…

相交链表(数据结构)

160. 相交链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/intersection-of-two-linked-lists/description/ 题目 解决思路 1&#xff0c;找到相交的点 相交链表的关键也就是找到相交的点&#xff0c;所以我们需要首先判断有没有相交的节点&#…

程序员必读书籍推荐

在快速发展的编程领域&#xff0c;不断学习和积累是每位程序员的必修课。以下是几本对于程序员来说&#xff0c;不容错过的必读书籍。 《代码大全》是一本编程界的经典之作&#xff0c;书中不仅详细介绍了编程的最佳实践&#xff0c;还深入探讨了软件构建的艺术。对于想要提升…

最新的云渲染100活动有哪些?渲染100邀请码1a12

随着科技的进步&#xff0c;云渲染已经成为设计行业的必备工具&#xff0c;各个云渲染平台为了吸引用户也推出各种各样的活动&#xff0c;今天我们以广受好评的渲染100为例&#xff0c;来说下它们的活动体系。 1、新用户活动 渲染100对新用户很友好&#xff0c;提供了充足的测…

K-RTD01和利时FW248中控卡件

K-RTD01和利时FW248中控卡件。 系统概述 的全称为保护工程师站及录波分析后台”是利用现代计算机和网络技术&#xff0c;K-RTD01和利时FW248中控卡件。实时收集变电站运行和故障信息&#xff0c;并通过对变电站的故障信息进行综合分析&#xff0c;K-RTD01和利时FW248中控卡件。…

Ps 滤镜:便条纸

Ps菜单&#xff1a;滤镜/滤镜库/素描/便条纸 Filter Gallery/Sketch/Note Paper 便条纸 Note Paper滤镜用于模拟手工纸张的质感和视觉效果。此滤镜将图像简化并添加浮雕和颗粒效果&#xff0c;使图像看起来像是在手工制作的纸上绘制或打印。 “便条纸”滤镜通过结合使用浮雕效果…

【代码】matlab调用COM端口获取传感器数据

参考链接 原始代码 clc clear close all fclose(instrfind)%先关闭所有串口 % scom serial(COM7); %建立串口对象函数&#xff08;需要手动和自己电脑的端口匹配&#xff09; fclose(scom); %关闭串口设备对象 scom.InputBufferSize 512;%输入缓冲区 scom.O…

为什么一个项目在idea中的配置文件设置端口号为8000,在vue中设置端口号为8080,项目可以运行成功?

在学习一个前后端分离开发的项目中&#xff0c;突然发现该项目在idea的配置文件中&#xff0c;设置的端口号为8000 application.properties&#xff1a; server.port8000 而在vue的配置文件中&#xff0c;设置的项目端口号为8080&#xff1a; devServer: {port: 8080,clien…

Copilot for Microsoft 365 扩充新增 16 种语言

最近&#xff0c;微软公司发布公告&#xff0c;进一步扩大 Copilot for Microsoft 365 语言支持&#xff0c;新增 16 种&#xff0c;支持的语言总数达到 25 种。 新支持的语言如下&#xff1a; 阿拉伯语 捷克语 丹麦语 荷兰语 芬兰语 希伯来语 匈牙利语 韩语 挪威语&am…

Sass详解:CSS预处理器的强大之处

Sass详解&#xff1a;CSS预处理器的强大之处 Sass&#xff0c;全称为Syntactically Awesome Style Sheets&#xff0c;是一种CSS预处理器&#xff0c;它扩展了CSS的功能&#xff0c;提供了变量、嵌套规则、混合&#xff08;Mixins&#xff09;、函数等强大的编程特性&#xff…

生活中的网络

加zkhengyang&#xff0c;可申请进数字音频系统研究开发交流答疑群(课题组) 最熟悉的是计算机网络&#xff0c;集线器&#xff0c;交换机&#xff0c;网桥&#xff0c;路由器&#xff0c;电脑主机&#xff0c;同轴电缆&#xff0c;双绞线&#xff0c;光纤等组成。 电视机网络…

网络安全科普:保护你的数字生活

# 网络安全科普&#xff1a;保护你的数字生活 ## 引言 在数字化时代&#xff0c;网络安全已成为每个人都必须面对的问题。从个人隐私保护到金融交易安全&#xff0c;网络的安全性直接关系到我们的日常生活。因此&#xff0c;普及网络安全知识&#xff0c;提高公众的网络安全意…

Elasticsearch 与 OpenSearch:6 个主要区别以及如何选择

什么是 Elasticsearch&#xff1f; Elasticsearch 是一个基于 Apache Lucene 构建的开源 RESTful 分布式搜索和分析引擎。它旨在处理大量数据&#xff0c;使其成为日志和事件数据管理的热门选择。Elasticsearch 还以其实时功能而闻名&#xff0c;允许用户在数据模式发生时对其…