剑指 Offer 57. 和为s的两个数字

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s
输入:nums = [2,7,11,15], target = 9 输出:[2,7] 或者 [7,2]

  1. //对撞指针,时间On,空间O1
  2. func twoSum(nums []int, target int) []int {
  3. left := 0
  4. right := len(nums) -1
  5. for left < right {
  6. sum := nums[left] + nums[right]
  7. if sum == target {
  8. return []int{nums[left], nums[right]}
  9. } else if target < sum {
  10. right--
  11. } else if target > sum {
  12. left++
  13. }
  14. }
  15. return nil
  16. }

解题思路
给的数字数组是升序排列的,故用双指针法求解:
定义双指针分别指向数组头尾,即最小、最大的数

  • 判断左右指针对应的数之和,与目标数的关系:计算和 sum 是否= nums[i] + nums[j];
  • 若sum > 大于目标数,就需要小一点,则右指针right左移,right—
  • 若sum < 小于目标数,就需要大一点,则左指针left右移,left++
  • 若sum 等于目标数,这两个数就是要求的数,立即返回数组nums[i],nums[j]
//哈希表法 时空都是On,类似两数之和
func twoSum(nums []int, target int) []int {
    m := make(map[int]struct{})

    for _,v :=range nums{
        if _,ok:=m[target-v];ok{
            return []int{target-v,v}
        }else {
            m[v]= struct{}{}
        }
    }
    return nil
}