一. leetcode描述
概述
- 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
- 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例
- 给定 nums = [2, 7, 11, 15], target = 9
- 因为 nums[0] + nums[1] = 2 + 7 = 9
- 所以返回 [0, 1]
二. 程序实现
1. Python实现
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
算法一
length = len(nums)
for i in range(length):
diff_num = target - nums[i] # 求差
if diff_num in nums: # 差值在nums中
j = nums.index(diff_num) # 计算+记录差值下标
if i != j: # 非同一个元素
return i, j # 以元组形式返回
# else:
# return None # 可省略,Python函数默认返回None
时间空间复杂度
- 时间复杂度
- 空间复杂度
算法二
dic = {} # 键: 差值 值: 差值下标
length = len(nums)
for i in range(length):
diff_num = target - nums[i]
if nums[i] in dic: # 当前遍历数字nums[i]在字典dic键视图dic.keys()中
return dic[nums[i]], i
else: # 添加键值对到字典dic
dic[diff_num] = i
时间空间复杂度
- 时间复杂度
- 空间复杂度
算法三: 暴力循环遍历
length = len(nums)
for i in range(length): # 遍历
for j in range(i+1, length): # +1遍历
diff_num = target - nums[i]
if diff_num == nums[j]:
return i, j
时间空间复杂度
- 时间复杂度
- 空间复杂度
2.Golang实现
算法一: 求差值
func twoSum(nums []int, target int) []int {
for i, v := range nums {
diffNum := target - v
index := isContain01(diffNum, i, nums)
if index >= 0 {
return []int{i, index}
}
}
return nil
}
func isContain01(diffNum, i int, nums []int) int {
for i := i + 1; i < len(nums); i++ {
if diffNum == nums[i] {
return i
}
}
return -1
}
时间空间复杂度
- 时间复杂度
- 空间复杂度
算法二
func twoSum(nums []int, target int) []int {
dic := make(map[int]int)
for i, v1 := range nums {
diffNum := target - v1
if isContain(dic, v1) {
return []int{dic[nums[i]], i}
} else {
dic[diffNum] = i
}
}
return nil
}
func isContain(dic map[int]int, v1 int) bool {
for k, _ := range dic {
if v1 == k {
return true
}
}
return false
}
时间空间复杂度
- 时间复杂度
- 空间复杂度
算法三: 暴力循环
func twoSum(nums []int, target int) []int {
length := len(nums)
for i, v := range nums {
diffNum := target - v
for j := i + 1; j < length; j++ {
if diffNum == nums[j] {
return []int{i, j}
}
}
}
return nil
}
时间空间复杂度
- 时间复杂度
- 空间复杂度