剑指 Offer 57. 和为s的两个数字

Posted 炫云云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 57. 和为s的两个数字相关的知识,希望对你有一定的参考价值。

剑指 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]

双指针法

利用 HashMap 可以通过遍历数组找到数字组合,时间和空间复杂度均为 O ( N ) O(N) O(N)

注意本题的 nums 是 排序数组 ,因此可使用 双指针法 将空间复杂度降低至 O ( 1 ) O(1) O(1)

算法流程

  1. 初始化: 双指针 i , j i, j i,j 分别指向数组 n u m s n u m s nums 的左右两端 。
  2. 循环搜索:当双指针相遇时跳出;
    1. 计算和 s = s= s= nums [ i ] + [i]+ [i]+ nums [ j ] [j] [j];
    2. s > s> s> target , 则指针 j j j 向左移动, 即执行 j = j − 1 j=j-1 j=j1;
    3. s < s< s< target , 则指针 i i i 向右移动, 即执行 i = i + 1 i=i+1 i=i+1;
    4. s = s= s= target , 立即返回数组 [ [ [ nums [ i ] [i] [i], nums [ j ] ] [j]] [j]];
  3. 返回空数组, 代表无和为 target 的数字组合。
class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        i, j = 0, len(nums) - 1
        while i < j:
            s = nums[i] + nums[j]
            if s > target: j -= 1
            elif s < target: i += 1
            else: return nums[i], nums[j]
        return []

参考

Krahets - 力扣(LeetCode) (leetcode-cn.com)

以上是关于剑指 Offer 57. 和为s的两个数字的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer 57. 和为s的两个数字

剑指 Offer 57. 和为s的两个数字

LeetCode(剑指 Offer)- 57. 和为 s 的两个数字

LeetCode(剑指 Offer)- 57. 和为 s 的两个数字

LeetCode——剑指 Offer 57 和为s的两个数字

算法剑指 Offer 57. 和为s的两个数字