Leetcode系列之两数之和
Leetcode系列之两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
链接:https://leetcode-cn.com/problems/two-sum/
Python实现(三种方法)
class Solution(object):
@staticmethod
def two_sum_1(nums: list, target: int):
"""方法一"""
for index1, num1 in enumerate(nums):
num2 = target - num1
if num2 in nums and nums.index(target - num1) != index1:
return [index1, nums.index(target - num1)]
@staticmethod
def two_sum_2(nums: list, target: int):
"""方法二"""
num_dict = {}
for index, num in enumerate(nums):
num_dict[num] = index
for i, num in enumerate(nums):
j = num_dict.get(target - num)
if j and i != j:
return [i, j]
@staticmethod
def two_sum_3(nums: list, target: int):
"""方法三"""
num_dict = {}
for index, num in enumerate(nums):
if target - num in num_dict:
return [num_dict[target - num], index]
num_dict[num] = index
go语言实现
package main
import "fmt"
func twoSum(nums []int, target int) []int {
maps := make(map[int]int) // map数据定义
nes := make([]int, 0) // 切片数据定义
for key, val := range nums {
ant := target - val
_, st := maps[ant]
if st {
nes = append(nes, maps[ant]) // 切片添加
nes = append(nes, key)
return nes
}
maps[val] = key
}
return nes
}
func main() {
nums := []int{2, 7, 11, 15}
target := 9
ret := twoSum(nums, target)
fmt.Println(ret)
}
- 执行结果
| 方法 | 执行用时 | 内存消耗 | 语言 |
|---|---|---|---|
| Python1 | 1168 ms | 14.9 MB | Python3 |
| Python2 | 68 ms | 15.4 MB | Python3 |
| Python3 | 68 ms | 15 MB | Python3 |
| go | 4 ms | 3.7 MB | Golang |
从执行结果可以看到,go语言的执行速度最快,内存消耗最少,执行速度和内存消耗明显有自身的优势。而Python实现的三种方法中,方法一的时间复杂度为O(n2),列表循环时间复杂度为O(n),每一次循环内都会进行一次判断
if num2 in nums and nums.index(target - num1) != index1:
in 列表查询的时间复杂度为O(n),因此整体时间复杂度为O(n2).方法二和方法三的时间复杂度为O(n),有人也许会说方法二和三的for循环中查询不是也要花费时间吗?我们带着问题去看一下方法二:
"""方法二"""
num_dict = {}
for index, num in enumerate(nums):
num_dict[num] = index
for i, num in enumerate(nums):
j = num_dict.get(target - num)
if j and i != j:
return [i, j]
两个for循环为O(n),字典赋值为O(1),字典查询为O(1)因此,整体时间复杂度为O(n)。
"""方法三"""
num_dict = {}
for index, num in enumerate(nums):
if target - num in num_dict:
return [num_dict[target - num], index]
num_dict[num] = index
方法三种in 字典时间复杂度为O(1),我们注意到这和方法一in 列表的O(n2)不同,字典查询确实比列表查询的效率高。
总结:不同语言之间的性能差异确实很大,尤其对于Python和go而言。go的性能确实无可挑剔,堪比C。但同时同一个题,同一种算法,python实现起来确实比较清爽,节省的时间、精力确实是python的优势,可以让人专注于程序的设计与思考,而不是各种复杂语法的实现。当然,不同语言各有优劣,社会需要什么,我们就去学什么,这才是王道!
Leetcode系列之两数之和的更多相关文章
- 每日一道 LeetCode (1):两数之和
引言 前段时间看到一篇刷 LeetCode 的文章,感触很深,我本身自己上大学的时候,没怎么研究过算法这一方面,导致自己直到现在算法都不咋地. 一直有心想填补下自己的这个短板,实际上又一直给自己找理由 ...
- Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解
Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全 Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...
- leetcode刷题--两数之和(简单)
一.序言 第一次刷leetcode的题,之前从来没有刷题然后去面试的概念,直到临近秋招,或许是秋招结束的时候才有这个意识,原来面试是需要刷题的,面试问的问题都是千篇一律的,只要刷够了题就差不多了,当然 ...
- LeetCode :1.两数之和 解题报告及算法优化思路
最近开始重拾算法,在 LeetCode上刷题.顺便也记录下解题报告以及优化思路. 题目链接:1.两数之和 题意 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 ...
- LeetCode 167:两数之和 II - 输入有序数组 Two Sum II - Input array is sorted
公众号: 爱写bug(ID:icodebugs) 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index ...
- LeetCode | No.1 两数之和
题目描述: Given an array of integers, return indices of the two numbers such that they add up to a speci ...
- leetCode刷题 | 两数之和
两数之和: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数 ...
- leetcode算法1.两数之和
哈喽!大家好,我是[学无止境小奇],一位热爱分享各种技术的博主! [学无止境小奇]的创作宗旨:每一条命令都亲自执行过,每一行代码都实际运行过,每一种方法都真实实践过,每一篇文章都良心制作过. [学无止 ...
- [LeetCode] Two Sum 两数之和
Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...
随机推荐
- 微服务下前后端分离的统一认证授权服务,基于Spring Security OAuth2 + Spring Cloud Gateway实现单点登录
1. 整体架构 在这种结构中,网关就是一个资源服务器,它负责统一授权(鉴权).路由转发.保护下游微服务. 后端微服务应用完全不用考虑权限问题,也不需要引入spring security依赖,就正常的 ...
- 【JavaWeb】【Eclipse】使用Eclipse创建我的第一个网页
使用Eclipse创建我的第一个网页 哔哩哔哩 萌狼蓝天 你可以直接点击Finish,也可以点击Next,到下面这个界面后,勾选生成web.xml然后Finish(你不这样做就会没有Web.xml文件 ...
- 05 - Vue3 UI Framework - Button 组件
官网基本做好了,接下来开始做核心组件 返回阅读列表点击 这里 目录准备 在项目 src 目录下创建 lib 文件夹,用来存放所有的核心组件吧.然后再在 lib 文件夹下创建 Button.vue 文件 ...
- vue-cli3 vue2 保留 webpack 支持 vite 成功实践
大家好! 文本是为了提升开发效率及体验实践诞生的. 项目背景: 脚手架:vue-cli3,具体为 "@vue/cli-service": "^3.4.1" 库: ...
- Table.Skip删除前面N….Skip/RemoveFirstN(Power Query 之 M 语言)
数据源: "姓名""基数""个人比例""个人缴纳""公司比例""公司缴纳"&qu ...
- Flask与Django的比较
Flask与Django的区别 Flask Flask确实很"轻",不愧是Micro Framework,从Django转向Flask的开发者一定会如此感慨,除非二者均为深入使用过 ...
- CF946B Weird Subtraction Process 题解
Content 有两个数 \(a,b\),执行如下操作: 如果 \(a,b\) 中有一个数是 \(0\),结束操作,否则跳到操作 \(2\). 如果 \(a\geqslant 2b\),那么 \(a\ ...
- java 图形化工具Swing 监听键盘输入字符触发动作getInputMap();getActionMap();
双缓冲技术的介绍: 所有的Swing组件默认启用双缓冲绘图技术.使用双缓冲技术能改进频繁重绘GUI组件的显示效果(避免闪烁现象)JComponent组件默认启用双缓冲,无须自己实现双缓冲.如果想关闭双 ...
- 使用JSONArray.fromObject转化list时,如果有集合属性,很容易出错,此刻把集合属性过滤掉便可
使用JSONArray.fromObject转化list时,如果有集合属性,很容易出错,此刻把集合属性过滤掉便可
- ts 遇到的问题
1. Property 'generatePdf' does not exist on type 'Element'. 问题:ts类型校验报错,使得编译失败 解决方法:将报错字段定义为any类型