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