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

题目

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值