美文网首页
37两数字和II-输入有序数组

37两数字和II-输入有序数组

作者: Jachin111 | 来源:发表于2020-08-17 23:43 被阅读0次

给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。

说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。

示例:
输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。

双指针

class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        if(not numbers):
            return []
        res=[]
        n=len(numbers)
        l=0
        r=n-1
        while(l<r):
            if(numbers[l]+numbers[r]==target):
                return [l+1,r+1]
            elif(numbers[l]+numbers[r]>target):
                r=r-1
            else:
                l=l+1
        return [-1,-1]

暴力法

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dict={}
        for i in range(len(nums)):
            dict[nums[i]]=i
        for j in range(len(nums)):
            tmp=target-nums[j]
            if(tmp in dict and dict[tmp]!=j):
                return [j,dict[tmp]]
        return False

两次哈希表

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dict={}
        for i in range(len(nums)):
            dict[nums[i]]=i
        for j in range(len(nums)):
            tmp=target-nums[j]
            if(tmp in dict and dict[tmp]!=j):
                return [j,dict[tmp]]
        return False

一次哈希表

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dict={}
        for i in range(len(nums)):
            if(nums[i] in dict):
                return [i,dict[nums[i]]]
            else:
                dict[target-nums[i]]=i
        return False

双指针+二分查找

class Solution:
    def binary_search(self,num,tar,left,right,if_find_left):
        while left<=right:
            mid=(left+right)//2
            if num[mid]<tar:
                left=mid+1
            elif num[mid]>tar:
                right=mid-1
            else:
                return mid
        return left if if_find_left else right

    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        l,r=0,len(numbers)-1
        while l<r:
            sum_=numbers[l]+numbers[r]
            if sum_<target:
                l=self.binary_search(numbers,target-numbers[r],left=l+1,right=r,if_find_left=True)
            elif sum_>target:
                r=self.binary_search(numbers,target-numbers[l],left=l,right=r-1,if_find_left=False)
            else:
                return [l+1,r+1]

来源:力扣(LeetCode)

相关文章

  • 37两数字和II-输入有序数组

    给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 ...

  • 数组---2. 有序数组中和为s的两个数(167 Two Sum

    57 有序数组中和为s的两个数 题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好...

  • Remove Duplicates from Sorted Ar

    有序数组中移除重复数字

  • 数据结构与算法之合并排序数组 II

    合并两个有序升序的整数数组A和B变成一个新的数组。新数组也要有序。 样例样例 1: 输入: A=[1], B=[1...

  • 二分查找

    题目描述: 输入一个有序的数组 sort_array 和一个无序的数组 random_array ,对于无序数组 ...

  • LeetCode 专题 :双指针

    LeetCode 第 167 题:两数之和 II - 输入有序数组 传送门:167. 两数之和 II - 输入有序...

  • 剑指offer | 和为s的两个数字

    和为s的两个数字 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s 示例输入:{0, ...

  • 二分查找及其扩展

    在有序数组中,二分查找是效率较高的查找算法。二分查找一般有递归和迭代 对有序数组查找指定数字在数组中出现的次数//...

  • 寻找和为定值的两个数

    寻找和为定值的两个数 题目描述: 输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。如...

  • 二分

    有重复数字的有序数组二分查找 两个有序数组的交集 https://www.cnblogs.com/yxzfscg/...

网友评论

      本文标题:37两数字和II-输入有序数组

      本文链接:https://www.haomeiwen.com/subject/uujgdktx.html