1. 两数之和 解题思路
我们可以使用哈希表来解决。以下是详细的思路:
- 创建一个哈希表(map)用于存储遍历过的元素及其对应的下标。
- 遍历数组nums,对每个元素进行以下操作:
计算目标值与当前元素的差值(complement)。
在哈希表中查找是否存在complement,如果存在,则说明找到了满足条件的两个数,直接返回它们的下标。
如果不存在则将当前元素及其下标存入哈希表中。 如果遍历完成后仍未找到符合条件的结果,返回空数组
func twoSum(nums []int, target int) []int {
dict := make(map[int]int)
for i, num := range nums {
complement := target - num
if index, ok := dict[complement]; ok {
return []int{index, i}
}
dict[num] = i
}
return nil
}
167. 两数之和 II - 输入有序数组
我们可以使用双指针来遍历数组,查找满足条件的两个数。以下是详细思路:
- 我们使用两个指针left和right,分别指向数组的起始和末尾。
- 在循环中,比较指针指向的两个数的和与目标值target的大小关系:
如果和等于target,说明找到了满足条件的两个数,返回它们的下标。 如果和小于target,将left指针右移一位。
如果和大于target,将right指针左移一位。
- 不断重复步骤2,直到找到满足条件的两个数或者left超过了right。
func twoSum2(nums []int, target int) []int {
left,right:=0,len(nums)-1
for left<right{
sum:=nums[left]+nums[right]
if sum==target{
return []int{left+1,right+1}
}else if sum<target{
left++
}else{
right--
}
}
return nil
}
总结
什么时候用双指针,什么时候用哈希表?
双指针通常适用于解决数组、链表等数据结构中,需要对数组中的值进行比较、查找、或者夹逼等操作的场景。双指针可以从数组的两端向中间移动,根据题目条件进行夹逼,从而得到满足条件的解。它在解决数组和链表中的很多问题时都有较高的效率。
哈希表通常适用于需要对数据的存储、查找、在一定范围内计数等操作的场景。通过将数组中的值存入哈希表并建立索引,可以加速数据查找和计数的过程。它在解决元素重复、查找元素、计数等问题时具有很大的优势。
这两道题都涉及查找数组中满足特定条件的数值对,但它们有一些关键的不同点:
目标:
第一道题目中,要求找出数组中两个数的和等于目标值。这种情况下,利用哈希表可以快速查找到满足条件的两个数。
第二道题目中,要求找出数组中相加之和等于目标数的两个整数的下标。这种情况下,使用双指针可以高效地找到满足条件的下标。
数据特点:
第一道题目中的数组对于查找来说并不一定需要有序。
第二道题目中的数组是按非递减顺序排列的,这种特点使得我们可以利用双指针夹逼的方式在数组中查找满足条件的下标。