LeetCode(#1)————Two Sum

问题描述

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

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

Solution:

	public static int[] twoSum(int[] nums, int target) {Map<Integer, Integer> map = new HashMap<>();// 建立值与下标对应关系for(int i = 0; i<nums.length; i++){map.put(nums[i], i);}// 获取键集合int[] arr = new int[2];for(int i = 0; i < nums.length; i++){int complement = target - nums[i];if(map.containsKey(complement) && map.get(complement) != i){arr[0] = i;arr[1] = map.get(complement);}}return arr;}

对于输入为[ 3, 3 ],target = 6 的测试case,我们要如何理解?

首先,在Map 中,相同的key 如果存在,那么旧的key 对应的 值就会被覆盖掉,第一个 for 循环结束后,map 中只有一个键值对,即:{ 3 = 1 },这并不会影响结果,只不过在 arr[0] 赋值的时候,需要注意,一定不要使用 arr[0] = map.get(nums[i]); 这种写法,看似与上面的正确解法语义上相同,但是却忽视了相同元素被覆盖掉的情况。

总结

上段代码引用了LeetCode上此问题支持率最高的解决方法。

看到题目的时候我是正常的用了二重for循环进行求解的,在LeetCode中也有我那种解法,他们称之为:Brute Force。

而上面贴出来的这种解法思路在于考虑到了时间复杂度。这里又不得不记录一下我收集到了对时间复杂度的理解:

基本操作执行次数与问题规模n成正比。

时间复杂度 共有八个同数量级分别是:1,log2n,n,n log2n,n^2,n^3,2^n,n!  

从 1 到 n! 时间复杂度依次增高。二重for循环记作O(n^2),三重for循环记作O(n^3)依此类推。

解释是这样的:To improve our run time complexity, we need a more efficient way to check if the complement exists in the array. If the complement exists, we need to look up its index. What is the best way to maintain a mapping of each element in the array to its index? A hash table.

为了改进我们运行时间的复杂程度,我们需要更有效的方法去array中检查是否有一个特定的“补足数”存在,如果存在,我们就去找他的index。那么维护数组元素与其下标之间的映射关系最好的途径是什么呢?没错,就是 hash 表。

这句话给我的印象特别深。那么如果下一次又出现一个问题要求我们找到两组值的对应关系的话,我们首先就会考虑到哈希表。这正是我希望得到的东西,一种思考的方向。

We reduce the look up time from O(n) to O(1) by trading space for speed. A hash table is built exactly for this purpose, it supports fast look up in near constant time. I say "near" because if a collision occurred, a look up could degenerate to O(n) time. But look up in hash table should be amortized O(1) time as long as the hash function was chosen carefully.

我们通过牺牲空间换取速度的方式来将时间复杂度从O(n)到O(1)。哈希表的建立正是为此目的,它支持在近乎不变的时间内快速查找。

 

 

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

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

相关文章

Log4j文件配置教程大全

Log4j文件配置教程大全~Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的&#xff0c;它可接keyvalue格式的设置或xml格式的设置信息。通过配置&#xff0c;可以创建出Log4J的运行环境。1&#xff0c; 整体框架介绍&#xff1a;#配置根Logger log…

微型计算机和接口技术考题,微型计算机接口技术以及应用考题

一、单项选择题1&#xff0e;通常在外设接口中&#xff0c;往往有( )端口才能满足和协调外设工作要求。A&#xff0e;数据 B&#xff0e;数据、控制 C&#xff0e;数据、控制、状态 D&#xff0e;控制、缓冲2&#xff0e;独立I&#xff0f;O端口编址方式中&#xff0c;端口地址…

Java本地文件操作

概述&#xff1a;Java本地文件操作&#xff0c;涉及到文件/文件夹的创建&#xff0c;文件/文件夹属性的读取与设置&#xff0c;文件/文件夹的重命名&#xff0c;目录结构的遍历&#xff0c;以及文件内容的读取与写入。 File属于java.io.File。 ---在Eclipse的大纲视图界面&…

GitBlit使用安装教程~

GitBlit使用安装教程~GitBlit是什么&#xff1f;Gitblit 是一个纯 Java 库用来管理、查看和处理 Git 资料库.相当于 Git 的 Java 管理工具.git的管家,通俗点来说就是一个相当于SVN的工具,用于多个人共同开发同一个项目&#xff0c;共用资源的目的。 下载与安装&#xff1a; 1. …

怎么用计算机名称共享打印机设置,如何共享打印机设置教程

打印机怎么共享&#xff0c;算是老问题了&#xff0c;但很多时候分享都是老系统的&#xff0c;这里分享WIN7系统和win10系统两种系统的打印机如何共享的设置教程。一、WIN7设共享准备工作&#xff1a;添加打印机之前我们要知道主机的一些信息&#xff0c;如计算机名、工作组、共…

Java项目转变为Java Web项目

1、找到项目工作空间目录&#xff0c;打开.project文件&#xff0c;并修改文件&#xff0c; 修改如下&#xff1a; 找到&#xff1a;<natures> </natures>代码段&#xff0c;在代码段中加入如下内容并保存&#xff1a; <nature>org.eclipse.wst.common.proje…

计算机网络学习总结

计算机网络学习总结~1. OSI&#xff0c;TCP/IP,五层协议的体系结构&#xff0c;以及各层协议&#xff1a; OSI 分层&#xff1a;7层&#xff0c;物理层&#xff0c;数据链路层&#xff0c;网络层&#xff0c;传输层&#xff0c;会话层&#xff0c;表示层&#xff0c;应用层 TC…

计算机网络实验报告校园网,校园网规划与设计实验报告.docx

校园网规划与设计实验报告校园网的规划与设计实验报告篇一&#xff1a;校园网设计与规划报告(计算机网络大实验)  《计算机网络》实践报告  校园网设计与规划   专 业&#xff1a; 软件工程   班 级&#xff1a; 软件0901  姓 名&#xff1a; 李双双  学 号:  指…

Linux(Ubuntu)下设置开机自启shell脚本执行Java程序jar包

一、建立脚本文件&#xff1a; 二、设置权限 三、将脚本文件放到启动目录下 四、更新优先级 cd /etc/init.d sudo update-rc.d startm.sh defaults 90 至此&#xff0c;开机启动已经完成&#xff0c;我们可以通过reboot重启linux&#xff0c;来查看jar包是否已经启动成功。而…

鼠标键盘与计算机无法连接,只有三个步骤可以轻松解决无法识别计算机,键盘和鼠标的问题!...

对于大多数人来说&#xff0c;无论是笔记本电脑还是台式机&#xff0c;浏览网络&#xff0c;聊天&#xff0c;玩游戏和办公室工作都像进食和喝水一样容易。但是了解计算机并不意味着了解计算机。有时&#xff0c;一个非常常见的小问题“键盘和鼠标无法响应”常常使许多朋友感到…

git学习入门~~~

创建版本库&#xff08;又名仓库&#xff0c;repository&#xff09;&#xff0c;可以理解为一个仓库&#xff0c;这个目录里面的所有文件都可以被Git管理起来&#xff0c;每个文件的修改、删除&#xff0c;Git都能跟踪&#xff0c;以便任何时刻都可以追踪历史&#xff0c;或者…

Linux(Ubuntu)设置系统时区

设置东八区的时间&#xff1a; #cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 查看&#xff1a; #date 如果现实CST即为正确。 另外&#xff0c;Java打成jar包后再linux下运行&#xff0c;获取的时间有可能不正确&#xff0c;我们需要修改一个文件&#xff0c;Ubuntu系…

兰州交通大学计算机科学与技术排名,兰州交通大学怎么样 全国排名是多少

兰州交通大学&#xff0c;原名兰州铁道学院&#xff0c;是我国第三所铁路院校。兰州交通大学学科特色鲜明、门类齐全&#xff0c;是中央部委投资省部共建重点大学&#xff0c;下面小编为大家详细介绍&#xff0c;供大家参考。兰州交通大学排名2020年兰州交通大学全国排名第166名…

数据库的哪些事儿~~

一 . 事务的四个特性&#xff1f; 四大特性是&#xff1a;ACID 原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;、持久性&#xff08;Durability&#xff09;介绍四个特性概念&#xff1b; 原…

众友科技计算机组成原理,组成原理:采用微程序控制器的模型机CPU设计(10页)-原创力文档...

课程设计报告课程名称&#xff1a; 计算机组成原理设计题目&#xff1a; 采用微程序控制器的模型机 CPU设计院 系&#xff1a;班 级&#xff1a;设 计 者&#xff1a;学 号&#xff1a;指导教师&#xff1a;目 录课程设计(大作业)报告 1昆明学院课程设计(大作业)任务书 错误&am…

JVM 运行时数据区域总结

引言 本博客总结自《深入理解 Java 虚拟机》&#xff0c;第二章。 一、概述 Java 虚拟机在执行 Java 程序的时候会把它所管理的内存划分为若干个不同的数据区域。 记忆口诀&#xff1a;两栈一计数&#xff0c;一堆一方法。 解释&#xff1a;第一句两栈分别是VM栈和本地方法栈…

一篇博客读懂设计模式之---单例模式

一篇博客读懂设计模式之---单例模式 一。 单例模式 单例对象&#xff08;Singleton&#xff09;是一种常用的设计模式。在Java应用中&#xff0c;单例对象能保证在一个JVM中&#xff0c;该对象只有一个实例存在。这样的模式有几个好处&#xff1a; 1、某些类创建比较频繁&…

计算机会计知识竞赛,全国企业会计信息化知识竞赛试题及答案

全国企业会计信息化知识竞赛试题及答案第 1 题(单选)下列各项中&#xff0c;符合会计软件不可逆的记账功能要求的是( A )A.记账标记不得通过任何操作予以取消B.不可以用红字凭证更正记账错误C.可以删除已经记账的记账凭证D.可以进行反记账第 2 题(单选)下列关于信息系统自动生成…

使用缓冲字节流:BufferedInputStream与BufferedOutputStream读写数据

功能逻辑&#xff1a;将一个视频文件通过缓冲字节输入流进行读取&#xff0c;然后再通过缓冲字节输出流将其重新拷贝输出。public static void main(String[] args) {try {FileInputStream fis new FileInputStream("Rick_and_Morty.mkv");//第二个参数指定了缓冲区…

多媒体计算机技术的主要特点,多媒体技术主要特点?

满意答案01and032013.11.24采纳率&#xff1a;41% 等级&#xff1a;11已帮助&#xff1a;5479人多媒体技术有以下几个主要特点&#xff1a;(1)集成性 能够对信息进行多通道统一获取、存储、组织与合成。(2)控制性 多媒体技术是以计算机为中心&#xff0c;综合处理和控制多媒…