关于golang:Golang力扣Leetcode剑指Offer数组57-和为s的两个数字双指针

54次阅读

共计 945 个字符,预计需要花费 3 分钟才能阅读完成。

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

提交截图

正文完
 0