您的位置:首页 > Web前端

【Golang】LeetCode-剑指Offer-面试题57-和为s的两个数字

2020-03-05 01:26 781 查看

题目

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。
如果有多对数字的和等于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 <= nums.length <= 10^5 1 <= nums[i] <= 10^6

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/he-wei-sde-liang-ge-shu-zi-lcof

解题思路

  • 因为数组是递增序列,定义首位双指针,left 和 right
  • 先用for循环或者二分法将大于目标值的数字全都排除
  • for left < right 循环判断 双指针对应的数字相加等于目标值,返回双指针对应的数字 nums[left]+nums[right]==target
  • 否则
      当 nums [ left ] > target - nums [ right ] 时,说明右边的值过大,right - 1
    • 当 nums [ left ] < target - nums [ right ] 时,说明左边的值过小,left + 1
  • 同理有:
      当 nums [ right ] > target - nums [ left ] 时,说明右边的值过大,right - 1
    • 当 nums [ right ] < target - nums [ left ]时,说明左边的值过小,left + 1
  • 这里选择一种情况写即可,否则会出现错误
  • 代码

    –执行用时:220 ms --内存消耗:10.4 MB

    func twoSum(nums []int, target int) []int {
    if nums==nil || len(nums)<2 {
    return nil
    }
    left:=0
    right:=len(nums)-1
    //大于目标值的数字全都排除
    for nums[right]>target{
    right--
    }
    for left<right{
    if nums[left]+nums[right]==target{
    return []int{nums[left],nums[right]}
    }
    if nums[left]>target-nums[right]{
    right--
    }else{
    left++
    }
    //同理有,这里选择一种情况写即可,否则会出现错误
    /*
    if nums[right]>target-nums[left]{
    right--
    }else{
    left++
    }
    */
    }
    return nil
    }

    在LeetCode该题中,我也有提交题解,欢迎查看。昵称:Sakura。

    • 点赞
    • 收藏
    • 分享
    • 文章举报
    士多啤梨先生 发布了57 篇原创文章 · 获赞 0 · 访问量 953 私信 关注
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: