题目:输出一个递增排序的数组和一个数字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]
思路:
- 一开始用两个 for 循环(蛮力法),不出意外超时了.
而后就想到 双指针 。因为元素是递增的,用一个指针 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))}
提交截图: