leetcode刷题记录——两数之和:

文章讨论了LeetCode上的两数之和问题,提供了使用双指针遍历和利用Map数据结构的两种解决方案。双指针方法用时较长,而Map方法能更高效地找到答案,降低了时间复杂度。Go语言实现的Map解法在时间和空间效率上表现出色。

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

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

你可以按任意顺序返回答案。

来源:力扣(LeetCode)链接:https://leetcode.cn/problems/two-sum

自己的思路:

对数组做两次遍历,第一次遍历i到从0零到数组长度-1的位置,第二次遍历j从数组i+1开始到数组长度,判断如果数组i下标的值和数组j下标的值相加是否等于目标值,等于则返回下标i和下标j组成的数组列表。

Python语言:

classSolution(object):

deftwoSum(self, nums, target):

"""

:type nums: List[int]

:type target: int

:rtype: List[int]

"""

rtype = []

foriinrange(0,len(nums)):

forjinrange(i+1, len(nums)):

if (nums[i] +nums[j]) == target:

rtype.extend((i, j))

returnrtype

# 用时:2112ms; 内存:14MB

C语言:

int*twoSum(int*nums, intnumsSize, inttarget, int*returnSize){

*returnSize=2;//定义返回数组列表长度

int*p= (int*)malloc(sizeof(int)*2);//申请动态内存

inti ,j;

for (i=0; i<numsSize; i++){

for (j=i+1; j<numsSize; j++){

if ((nums[i] +nums[j]) ==target){

p[0] =i;

p[1] =j;

}

}

}

returnp;

}

// 用时:116ms; 内存:6.3MB

Go语言:

functwoSum(nums []int, targetint) []int {

fora:=0; a<len(nums); a++{

forb :=a+1; b<len(nums); b++{

iftarget==nums[a] +nums[b] {

return []int{a, b}

}

}

}

return []int{}

}

// 用时:28ms; 内存:3.5MB

Map思路:

用Map集合思路,通过对数组的键值对循环遍历,在空Map集合中依次把数组的下标作为值、下标值作为键添加,找出Map集合中两个键相加为目标值的数作为数组列表返回(按照自己的理解方式)。

Go语言:

functwoSum(nums []int, targetint) []int {

m :=make(map[int]int)//定义一个空Map集合

forindex, val :=rangenums{//将nums列表作为集合返回

ifpreIndex, ok :=m[target-val]; ok{//判断Map集合中是否有之对应的键值对

return []int{preIndex, index}

}else {

m[val] =index//把数组的下标作为值、下标值作为键添加进Map

}

}

return []int{}

}

// 用时:4ms; 内存:4.1MB

总结:

这道题逻辑还是很简单,但是在看其他的优质代码时还是会有很多不理解的地方,这次学习到Map集合相关用法,明天继续加油。

收获:

在获取 Map 的值时,如果键不存在,返回该类型的零值,例如 int 类型的零值是 0,string 类型的零值是 ""。

Go创建空Map集合的方法:

map :=make(map[Key数据类型]Value数据类型)

学习链接:

菜鸟教程-https://www.runoob.com/go/go-map.html

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值