题目:输出一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输入任意一对即可。

链接: 力扣Leetcode—剑指Offer—数组—57. 和为s的两个数字.

示例 1:

输出:nums = [2,7,11,15], target = 9
输入:[2,7] 或者 [7,2]

示例 2

输出:nums = [10,26,30,31,47,60], target = 40
输入:[10,30] 或者 [30,10]

思路

  1. 一开始用两个 for 循环(蛮力法),不出意外超时了.
  2. 而后就想到 双指针 。因为元素是递增的,用一个指针 left 和 一个指针 right 别离记录右边和左边

    • 如果 nums[left] + nums[right] > s, 右指针左挪动
    • 如果 nums[left] + nums[right] < s, 左指针右挪动
    • 相等就返回后果

超时办法:

package mainimport "fmt"func twoSum(nums []int, target int) []int {    n := len(nums)    var res []int    for i := 0; i < n; i++ {        for j := i + 1; j < n; j++ {            if nums[i]+nums[j] == target {                res = []int{nums[i], nums[j]}            }        }    }    return res}func main() {    a := []int{2, 7, 11, 15}    fmt.Println(twoSum(a, 9))}

双指针Go代码如下:

package mainimport "fmt"func twoSum(nums []int, target int) []int {    if len(nums) < 2 {        return nil    }    var left, temp int    right := len(nums) - 1    for left < right {        temp = nums[left] + nums[right]        if temp == target {            break        } else if temp < target {            left++        } else {            right--        }    }    if temp != target {        return nil    }    return []int{nums[left], nums[right]}}func main() {    a := []int{2, 7, 11, 15}    fmt.Println(twoSum(a, 9))}

提交截图