当前位置: 首页 > 编程日记 > 正文

leetcode_1. Two Sum

leetcode_1. Two Sum

前言:

这段时间开始敲leetcode。我认为这并不仅仅只是为了应付笔试,面试。而是确实有着一定的意义。

尤其,你提交代码后,网站会多方面验证你的答案。

另外,提交成功后,你可以查看自己的运行时间,以及别人的运行时间。

最最关键的是,这之后,你可以查看别人的优秀代码。

这还不算,其中讨论模块,解决方案模块。

虽然以前在大学,玩过ACM。但是,体验和leetcode差很多。

所以,我是比较推荐的。

之前,我都是按照题目的序号来进行解题。

不过,其中hard难度的题目,确实对于现在的我来说有一定难度。

尤其是做到一篇寻找最长回文串的midium难度后,又做了一个判断是否为回文串的easy难度题目。

所以,我决定从简单的题目开始做起来。

我应该只会将一些midium难度的题目发布上来。以及一些有着不错亮点的easy题目。

一,问题:

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:

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

翻译:

函数的输入是一个int数组以及一个目标值。通过在数组中选择两个int整数,来凑出目标值。

我们可以假设每个输入只有一个解决方案。并且数组中的每个元素只能使用一次。

(貌似,现在已经有了leetcode中文版。但是一方面,我希望锻炼一下自己的专业英文,另一方面,中文版的功能支持还不完善)

二,思路:

1.暴力法:通过双重循环,来遍历所有可能性,判断是否与目标值相等,如果相等,输入该循环内的两个数。

  优化:类比于排序算法的优化,外层循环遍历的nums[i]与内层循环遍历的nums[j],完全没必要再通过外层循环的nums[j]与内层循环的nums[i]这样来重复。

2.针对法:通过单次循环获取数组中每一个元素nums[i],再通过找寻数组内是否存在nums[j]使得nums[j]==target-nums[i],因为许多语言,内置了相关的搜搜索函数。如js的indexof.

三,代码:

我之后的这些题目都将采用go语言来实现。

V1:

func twoSum(nums []int, target int) []int {result := make([]int, 0)for k, v := range nums {for k2, v2 := range nums[k+1:] {if v+v2 == target {result = append(result, k,k2+k+1)return result}}}return result
}

由于并没有在go中找到相关的类似indexof的函数,所以,我便采用了暴力解法。

Runtime:80ms,6.40%

这里,我对于go的slice产生了一些疑惑,这导致我增添了一个无用的result变量。所以,我需要修改一下。

V2:

func twoSum(nums []int, target int) []int {for k, v := range nums {for k2, v2 := range nums[k+1:] {if v+v2 == target {return []int{k, k+k2+1}}}}return []int{}
}

PS:我们完全可以通过一句    return []int{k, k+k2+1}  来新建并返回一个匿名的slice。

Runtime:36ms,39.93%

相对与V1版本有了进步,但是仍然与TOP1的差很多。

从语法的角度,改进的空间已经不是很大了。那么只能从算法的结构上来提升。

虽然,go语言没有indexof。但是go语言还有map。

我曾今见过一两个通过map来提升速度的函数。但是,轮到自己来设计,还真是有些不适应。尤其,我对map还不是那么的熟悉,这导致我无法了解它的原理,从而降低耗时。

所以,我只能先试一试。直接先将所有的值都放在Map上,然后通过map间接性的实现indexof功能。

V3:

func twoSum(nums []int,target int) []int {m:=make(map[int]int)for k,v:=range nums{m[v]=k}for k,v:=range nums{another:=target-vk2,ok:=m[another]if ok== true &&k!=k2{return []int{k,k2}}}return nil
}

PS:这算是最无脑,直接的map算法。

Runtime:32ms,40.19%

即使这个算法非常无脑,只是非常僵硬地使用了map。但是依旧比v2快速。并且,这个方法从代码的角度依旧可以改进嘛。

起码两次循环遍历,完全是可以避免的。

V4:

 1 func twoSum(nums []int,target int) []int {
 2     m:=make(map[int]int)
 3     for k,v:=range nums{
 4         another:=target-v
 5         k2,ok:=m[another]
 6         if ok== true &&k!=k2{
 7             return []int{k,k2}
 8         }
 9         m[v]=k
10     }
11     return nil
12 }

PS:这里有一个非常关键的地方,那就是第9行的m[v]=k必须在第5行的k2,ok:=m[another]前。这样就避免了数组内有相同元素3,target=6,而导致的k2=k的情况。因为在map中相同键值的value值会后者覆盖前者的。

Runtime:8ms,85.92%

这可以说是一个非常喜人的结果了。从最后的结果分析图来看,只有一种算法要超过V4算法。

但是,我在尝试了几次代码上map的优化,还是没有办法。我甚至想是不是从内存的角度解决的。但是感觉可能性不大。

最后,简化出一个版本。

V5:

 1 func twoSum(nums []int,target int) []int {
 2     m:=make(map[int]int)
 3     for k,v:=range nums{
 4         another:=target-v
 5         if k2,ok:=m[another]; ok {
 6             return []int{k,k2}
 7         }
 8         m[v]=k
 9     }
10     return nil
11 }

Runtime:8ms,85.92%

虽然,简化了内存和判断条件。但是运算时间依然没有提高。甚至在一次改进中还出现时间增加到12ms的情况。

所以这应该是我提交的最终版本了。

四,他人代码:
1.最佳代码:

无论如何,也要看看完成最佳的代码是如何实现的。

 1 func twoSum(nums []int, target int) []int {
 2     m := make(map[int]int)
 3     for i := 0; i < len(nums); i++ {
 4         comp := target - nums[i]
 5         if _, ok := m[comp]; ok {
 6             return []int {m[comp], i}
 7         }
 8         m[nums[i]] = i
 9     }
10     return nil
11 }

Runtime:4ms,100%

2.分析:

从这个代码来看,其结构基本和我的最终版V5类似了。区别在于1,他没有使用range函数;2,他第5行没有接受key值,在第6行中采用map[key]来获取所需的value值。

那么究竟是哪个造成这4ms的差距。

但从理论上分析,我确实无法做到。但是我可以一个个去尝试嘛。

3.结果:

然而,在测试过程中,我发现了很尴尬的情况。那就是我的V5算法和TOP算法会跳动。有时候4ms,100%,有时候8ms,85.92%。

结果,另外一次提交:

请注意,下面的代码部分是完全一摸一样的。。。

表示这种情况也是有些尴尬。

不过,两者的算法应该差距不大了。

五,总结:

1,任何问题的第一要求是解决问题。不管是什么方法,想想出来一个解决问题。再谈优化。

2.任何函数都需要各种各样的测试,如溢出等。这样才可以令函数更具健壮性。

3.很多时候,go可以通过map来实现其他语言indexof的功能。而且性能很好。

4.算法结构解决完了,更可以优化代码结构。

PS:V4中解决键值冲突,只需要简单的换个位置就可以了。

PS2:map通过键值找不到的值,会返回相关零值。如果需要判断到底是否存在,请使用ok接收。

如有更正,请指出。谢谢。

(话说,for循环中到底是用i好呢,还是用range更好呢。)

转载于:https://www.cnblogs.com/Tiancheng-Duan/p/9035580.html

相关文章:

linux ngxtop安装安装及使用

写在前面&#xff1a; ngxtop是Nginx日志实时分析利器 1.下载 下载地址&#xff1a;https://github.com/lebinh/ngxtop 下载zip文件到本地 登录linux服务器&#xff0c;定位到安装目录&#xff0c;执行 rz&#xff0c;选中上一步下载的zip文件&#xff0c;上传完成后执行unzip…

POJ1088(滑雪)

题目链接 动态规划题。 题目大意&#xff1a;给定一个二维数组&#xff0c;数组中每个数代表一个高度&#xff0c;每次只能向相邻且高度下降的方向移动&#xff0c;求最长的移动距离。 View Code 1 #include <stdio.h>2 #include <memory.h>3 #define MAX(a,b) ((…

【硬件基础】个人感悟+C语言 引入头文件时引号括号的区别

前言&#xff1a; 惊&#xff01;一博主又在水博客 其实不然&#xff0c;单片机从大一下半年就已经开始自学&#xff0c;但是可能是由于高中养成的惰性思维&#xff0c;不愿意思考&#xff0c;只想靠时间来获得内心的满足感&#xff1a;看我今天又学了一天。其实&#xff0c;假…

走在网页游戏开发的路上(八)

游戏中定时器的设计 0. 前言 在游戏开发中计时器/定时器是必须的&#xff0c;而且会在多处用到&#xff0c;如吃药补血每秒回10点且持续1分钟、玩家从一点到达另一点的过程需要多少时间。下面是定时器在七雄争霸中的几个应用场景&#xff0c;直接上图&#xff1a; 场景1&#…

[epoll]epoll理解

转自&#xff1a;http://blog.51cto.com/yaocoder/888374 1. 流 首先我们来定义流的概念&#xff0c;一个流可以是文件&#xff0c;socket&#xff0c;pipe等等&#xff0c;可以进行I/O操作的内核对象&#xff0c;不管是文件&#xff0c;还是套接字&#xff0c;还是管道&#x…

[kuangbin带你飞]专题五 并查集 E - 食物链 (带权并查集)

E - 食物链 题目链接&#xff1a;https://vjudge.net/contest/66964#problem/E 动物王国中有三类动物A,B,C&#xff0c;这三类动物的食物链构成了有趣的环形。A吃B&#xff0c; B吃C&#xff0c;C吃A。 现有N个动物&#xff0c;以1&#xff0d;N编号。每个动物都是A,B,C中的一种…

关于内网linux系统如果安装nodejs,npm,express,mongodb,forever等

内网的linux系统要安装nodejs以及express等系列的框架&#xff0c;因为系统是局域网和互联网是物理隔离的&#xff0c;所以&#xff0c;没法像官网的安装教程那样直接install了&#xff0c;只能手动安装&#xff0c;这里已经我们自己的linux 系统suse10 为例&#xff1a; 1 No…

【基础知识】如何在word中粘贴出漂亮整洁的代码

使用工具&#xff1a; notepad、WPS 操作实现&#xff1a; 1、右击代码文件使用NPP打开文件 2、选中要复制的代码 3、如图所示&#xff0c;依次点击如下内容 4、直接粘贴到word中&#xff0c;如图

浅析SQL Server数据修复命令DBCC的使用

SQL Server数据库提供了修复命令DBCC&#xff0c;当SQL Server数据库遭到质疑或者是有的无法完成读取时可以尝试用此命令来修复。以下是一些常见的DBCC修复命令&#xff0c;希望会给读者带来帮助。 1. DBCC CHECKDB 重启服务器后&#xff0c;在没有进行任何操作的情况下&#x…

Python之Mysql及SQLAlchemy操作总结

一、Mysql命令总结 1.创建库 create database test1; 2.授权一个用户 grant all privileges on *.* to feng% identified by 1qazWSX; 3.创建表 create table Teacher(teaId int not null, teaname varchar(100), age int, sex enum(M, F), phone int); 4.查询 select * from t…

NSwagStudio for Swagger Api

本案例主要说明如何使用NSwag 工具使用桌面工具快速生成c# 客户端代码、快速的访问Web Api。 NSwagStudio 下载地址 比较强大、可以生成TypeScript、WebApi Controller、CSharp Client 1、运行WebApi项目 URL http://yourserver/swagger 然后你将看到界面如下 1.1 Web API 代…

【html】如何解决标签设置成超链接后字体格式及颜色变化的问题

问题描述&#xff1a; 如图所示&#xff0c;将一个标签设置成超链接后字体颜色和格式会发生改变&#xff0c;如果我只想让它保持原来的格式应该怎么办&#xff1f; 解决方法&#xff1a; 在a标签中添加一个属性&#xff1a; style"color:inherit;" 添加后的代码&…

js判断 IE 浏览器

1 $.browser.msie && ($.browser.version 6.0) 转载于:https://www.cnblogs.com/zhupinglei/archive/2012/04/28/2475186.html

UNIX编程笔记:关于停止的进程接收信号的问题

为什么80%的码农都做不了架构师&#xff1f;>>> 因为资料缺少&#xff0c;按照测试得出来&#xff0c;停止状态的进程貌似只对SIGCONT有反应&#xff0c;而别的默认就是忽略。 转载于:https://my.oschina.net/kut/blog/27736

脱壳 VMProtect 1.70.4

【文章标题】: 脱壳 VMProtect 1.70.4 【文章作者】: hxqlky【作者邮箱】: zmunlkygmail.com【作者主页】: http://www.x5dj.com/hxqlky【下载地址】: 自己搜索下载【加壳方式】: VMProtect 1.70.4【保护方式】: VMProtect 1.70.4【编写语言】: MASM32 / TASM32 【使用工具】:…

互联网协议详解

本文转载自&#xff1a;https://www.cnblogs.com/111testing/p/6942585.html 目录&#xff1a;&#xff1a;&#xff1a;&#xff1a;&#xff1a;&#xff1a; 一、网络协议 二、TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09; TCP头格式…

【java】巨菜博主安装jdk为什么每次都失败?

今天到公司实习第一天&#xff0c;博主兴高采烈地的使用起来的公司配备的电脑&#xff0c;第一步是干啥&#xff1f;当然是安装JDK了&#xff0c;博主平生安装JDK次数数不胜数&#xff0c;但一遍整下来没有任何差错的情况少之又少。今天也不例外&#xff0c;多敲了个空格害我足…

怎么在vs2010中使用ActiveX Test Container(转)

ActiveX Test Container Application is Still Available(转) Hello, I’m Pat Brenner, a developer on the Visual C Libraries team. I’ve noticed some posts on various forums lamenting the loss of the ActiveX Test Container application and I wanted to address …

C#自定义控件四简易时钟

C#自定义控件四简易时钟效果图&#xff1a;简易时钟&#xff0c;顾名思义&#xff0c;简单容易&#xff0c;简单到什么程度呢&#xff1f;界面只有数字和指针&#xff0c;甚至连与当前时间都不能匹配&#xff01;呵呵&#xff01;就这么简单&#xff0c;学习嘛&#xff0c;从简…

GitLab 配置邮箱

设置 SMTP 发送邮件 这里以腾讯企业邮箱为例&#xff0c;其他邮箱可以参考 设置 SMTP 发送邮件。 SMTP 和 POP3/IMAP 协议 SMTP 负责发送邮件&#xff0c;POP3/IMAP 负责接收邮件。其中 IMAP 基本上替换掉了 POP3。 用户在使用客户端&#xff08;例如 Foxmail&#xff09;时&am…

在 Ubuntu Natty 中解除系统托盘限制

在 Ubuntu 11.04 Natty 中&#xff0c;Ubuntu 对顶部面板右上角的通知区域&#xff08;系统托盘&#xff09;采用了白名单制度&#xff0c;只有支持 Indicators 并位于白名单的部分程序才会被显示在系统托盘中&#xff0c;目前支持的程序有&#xff1a; Java apps, Mumble, Win…

Oracle10g客户端远程连接数据库全过程[转]

最近项目用到了oracle&#xff0c;使用的是oracle10g&#xff0c;因为小组内有多人使用数据库&#xff0c;并且oracle数据库很占内 存&#xff0c;就放在单独的一台服务器上&#xff0c;所以最好每个人都装一个oracle10g的客户端。那么客户端到数据库的远 程访问时免不了的了。…

【css】页面出现两个滚动条以及只有一半页面显示内容的解决方法

可能当修改页面的margin等属性时会出现页面只有一半的页面显示内容的情况&#xff0c;此时我们可以修改css代码来解决问题 代码实现&#xff1a; body{overflow:hidden}html{/*overflow-y:scroll;*/ }html{overflow: auto; } 注意&#xff1a;该代码为css代码&#xff0c;需…

Microsoft Dynamics Marketplace

微软对一些产品提供网上销售第三方插件/解决方案的站点叫做 Marketplace&#xff0c;比如 Windows Phone Marketplace, Dynamics Marketplace.这样可以帮助合作伙伴/客户提供一个网上的产品交流平台&#xff0c;Microsoft Dynamics Marketplace 针对微软CRM/ERP 产品&#xff0…

【hdu】4521 小明序列【LIS变种】【间隔至少为d】

题目链接&#xff1a;https://vjudge.net/contest/228455#problem/B 转载于&#xff1a;https://blog.csdn.net/a709743744/article/details/51765252 题目大意&#xff1a; 求最长上升子序列&#xff0c;其中子序列中相邻的两个数的下标差要超过k 解题分析&#xff1a; 子序列…

【bootstrap】bootstrap-4.5.0-example 各个模板展示

前言&#xff1a;博主做前端开发的时候经常用到bootstrap&#xff0c;但挑选模板的时候&#xff0c;需要一个一个的打开文件夹、打开html文件再查看模板是否合适&#xff0c;这样实在有点浪费时间&#xff0c;所以今天博主将各个页面截图展示出来&#xff0c;之后方便大家也方便…

HDU1053 Entropy 哈夫曼树

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1053 认真读题&#xff0c;别怕题长&#xff0c;此题考查的就是哈夫曼树并求出最小编码值&#xff0c;注意每一次要将数组清0&#xff0c;否则会出错&#xff01; AC代码&#xff1a; #include<iostream>…

C++用数组和链表分别实现Queue

C用数组和链表分别实现Queue 昨天写了《C用数组和链表分别实现Stack》&#xff0c;今天就是《C用数组和链表分别实现Queue》&#xff0c; 队列就是先来的先被处理掉&#xff0c;后来的就等&#xff0c;直到成为先来的&#xff0c;实现起来感觉和栈差不多。 模板好用的&#xff…

bzoj1150 [CTSC2007]数据备份Backup

大概就是写了道生日礼物那个不知道叫啥的贪心。。。。。 大概就是说这道题和那个比较像。。。 所以留着看看吧&#xff0c;哪天想起了回来做这道题咯~ 转载于:https://www.cnblogs.com/LLppdd/p/9051440.html

004本周总结报告

这一周总的来说并没有学到多少东西。只是学习了java数组相关的知识&#xff0c;发现和C/C中的数组基本一样&#xff0c;同时也了解到堆内存和栈内存的概念。在学习数组时发现java数组的length属性很好用&#xff0c;学习了数组的插入赋值&#xff0c;冒泡和选择排序等并用数组的…