题目:输入一个递增排序的数组和一个数字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 main

import "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 main

import "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))
}

提交截图

在这里插入图片描述


土豆
17 声望5 粉丝