返回
Go语言实现:LeetCode 1. 两数之和
后端
2023-09-26 21:06:51
问题的
给定一个整数数组 nums
和一个目标值 target
,请找出两个数字的下标,使得这两个数字之和等于 target
。你可以假设每个输入只有一个解,并且你不能重复使用同一个元素。
实现过程:
1. 暴力求解
最简单的方法是使用暴力求解法,即遍历数组中的所有元素,并检查每一个元素与其他所有元素之和是否等于 target
。如果找到这样的两个元素,则返回它们的下标。
func twoSum(nums []int, target int) []int {
for i := 0; i < len(nums); i++ {
for j := i + 1; j < len(nums); j++ {
if nums[i] + nums[j] == target {
return []int{i, j}
}
}
}
return nil
}
2. 使用哈希表
我们可以使用哈希表来存储数组中的元素及其下标。然后,对于每个元素,我们可以检查其补数(即 target - nums[i]
)是否在哈希表中。如果在,则返回该元素的下标和补数的下标。
func twoSum(nums []int, target int) []int {
hashmap := make(map[int]int)
for i, num := range nums {
complement := target - num
if idx, ok := hashmap[complement]; ok {
return []int{idx, i}
}
hashmap[num] = i
}
return nil
}
3. 排序数组
我们可以先将数组进行排序,然后使用双指针法来查找两个元素之和等于 target
的下标。
func twoSum(nums []int, target int) []int {
sort.Ints(nums)
left, right := 0, len(nums)-1
for left < right {
sum := nums[left] + nums[right]
if sum == target {
return []int{left, right}
} else if sum < target {
left++
} else {
right--
}
}
return nil
}
时间和空间复杂度分析:
- 暴力求解法 :时间复杂度为
O(n^2)
,空间复杂度为O(1)
. - 使用哈希表 :时间复杂度为
O(n)
,空间复杂度为O(n)
. - 排序数组 :时间复杂度为
O(nlogn)
,空间复杂度为O(1)
.
总结:
在本文中,我们介绍了三种解决 LeetCode 1. 两数之和问题的方法。这些方法各有优缺点,您可以根据具体情况选择合适的方法。如果您需要更高的性能,可以使用哈希表或排序数组的方法。如果您需要更简单的实现,可以使用暴力求解法。