剑指offer57:和为s的两个数字 python

    技术2022-07-11  121

    剑指offer57:和为s的两个数字 python

    题目描述解法

    题目描述

    解法

    双指针 由于是递增数列,所以两个指针分别放在头尾。如果和大于target那么尾指针往左移一位,反之,头指针右移一位。 class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: i, j = 0, len(nums)-1 while i != j: if nums[i] + nums[j] < target: i += 1 if nums[i] + nums[j] > target: j -= 1 if nums[i] + nums[j] == target: return [nums[i],nums[j]] return None 双指针+2分法 可以增加一个2分判断是否需要加速指针缩进。 a 首先初始化两个指针,头指针i和尾指针j,split =(i+j)/2。 b 如果nums[i]+nums[j] < target,判断nums[split]+nums[i],如果小于,那么不需要加速缩进,说明结果在split和j之间,反之,则加速缩进,说明最终结果在i和split之间,若等于,那么直接return。 c 如果nums[i]+nums[j] < target,同上。 d 如果等于,return nums[i]和nums[j] class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: i, j = 0, len(nums)-1 while i != j: if nums[i] + nums[j] < target: split_idx = int((i+j)/2) if nums[split_idx] + nums[j] < target: i = split_idx + 1 elif nums[split_idx] + nums[j] > target: i += 1 else: return [nums[split_idx],nums[j]] elif nums[i] + nums[j] > target: split_idx = int((i+j)/2) if nums[split_idx] + nums[i] > target: j = split_idx - 1 elif nums[split_idx] + nums[i] < target: j -= 1 else: return [nums[split_idx],nums[i]] else: return [nums[i],nums[j]] return None
    Processed: 0.008, SQL: 9