返回
LeetCode 0x0001 Two Sum 题解:清晰阐释,Go 代码轻松上手
闲谈
2023-12-17 20:50:07
1. 题解概要
-
给定一个整数数组nums和一个目标值target,找出两个整数的组合,使得它们的和等于target。
-
要求:
- 每个整数只能使用一次。
- 返回这两个整数在nums中的下标。
2. 解法剖析
2.1 指针法
指针法通过双指针遍历数组,寻找满足要求的两个整数。
func twoSum(nums []int, target int) []int {
// 初始化两个指针i和j,i指向数组开头,j指向数组末尾。
i, j := 0, len(nums)-1
// 当指针i和j未相遇时,继续循环。
for i < j {
// 计算两个指针所指整数之和。
sum := nums[i] + nums[j]
// 根据sum与target的关系,调整指针位置。
if sum == target {
return []int{i, j}
} else if sum < target {
i++
} else {
j--
}
}
// 未找到满足要求的整数组合,返回空切片。
return []int{}
}
2.2 字典法
字典法通过字典存储已经遍历过的整数和它们在nums中的下标。
func twoSum(nums []int, target int) []int {
// 初始化字典m。
m := make(map[int]int)
// 遍历数组。
for i, num := range nums {
// 计算差值。
diff := target - num
// 如果差值在字典中,则返回两个整数的下标。
if idx, ok := m[diff]; ok {
return []int{idx, i}
}
// 将当前整数及其下标添加到字典中。
m[num] = i
}
// 未找到满足要求的整数组合,返回空切片。
return []int{}
}
3. 复杂度分析
3.1 指针法
- 时间复杂度:O(n),其中n是数组nums的长度。最坏情况下,需要遍历整个数组。
- 空间复杂度:O(1),不使用额外空间。
3.2 字典法
- 时间复杂度:O(n),其中n是数组nums的长度。最坏情况下,需要遍历整个数组。
- 空间复杂度:O(n),需要使用哈希表存储已经遍历过的整数。
4. 结语
通过本文,您已经掌握了LeetCode 0x0001 Two Sum 这道题的两种解法,并深入了解了它们的复杂度。无论您是刚入门还是经验丰富的程序员,都可以通过本文有所收获。如果您有任何疑问或建议,欢迎在评论区留言。
Happy Coding!