给定一个整数数组 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数据类型)
文章讨论了LeetCode上的两数之和问题,提供了使用双指针遍历和利用Map数据结构的两种解决方案。双指针方法用时较长,而Map方法能更高效地找到答案,降低了时间复杂度。Go语言实现的Map解法在时间和空间效率上表现出色。
817





