zoukankan      html  css  js  c++  java
  • 167. Two Sum II

    Given an array of integers that is already sorted in ascending order, find two numbers such that they add up to a specific target number.

    The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.

    You may assume that each input would have exactly one solution and you may not use the same element twice.

    Input: numbers={2, 7, 11, 15}, target=9
    Output: index1=1, index2=2

    用hash查找:

    # dictionary           
    def twoSum2(self, numbers, target):
        dic = {}
        for i, num in enumerate(numbers):
            if target-num in dic:
                return [dic[target-num]+1, i+1]
            dic[num] = i

    用二个指针:

    class Solution(object):
        def twoSum(self, numbers, target):
            """
            :type numbers: List[int]
            :type target: int
            :rtype: List[int]
            """        
            i = 0
            j = len(numbers)-1
            while i<j:
                if numbers[i]+numbers[j]==target:
                    return [i+1, j+1]
                elif numbers[i]+numbers[j]>target:
                    j -= 1
                else:
                    i += 1
            return []     

    二分:

    class Solution(object):
        def twoSum(self, numbers, target):
            """
            :type numbers: List[int]
            :type target: int
            :rtype: List[int]
            """ 
            for i in xrange(len(numbers)):
              l, r = i+1, len(numbers)-1
              tmp = target - numbers[i]
              while l <= r:
                mid = l + (r-l)//2
                if numbers[mid] == tmp:
                    return [i+1, mid+1]
                elif numbers[mid] < tmp:
                    l = mid+1
                else:
                    r = mid-1

     二分优化:当target numer在数组表示的范围里,如果没有找到该数字,则循环结束一定有numbers[l]>target>numbers[r],当初阿里面试就是找里某个数最近的数字。。

    class Solution(object):
        def twoSum(self, numbers, target):
            """
            :type numbers: List[int]
            :type target: int
            :rtype: List[int]
            """                 
            def bsearch(nums, target, l, r): 
                if target < nums[l]: return (0, l)
                if target > nums[r]: return (0, r)
                while l <= r:
                    mid = (l+r)>>1
                    if nums[mid] == target:
                        return (1, mid)
                    elif nums[mid] > target:
                        r = mid - 1
                    else:
                        l = mid + 1
                return (0, r)
                # 3 4 5 => 3.5 final l=1, r=0 在范围里但是没有查找到
                # 3 4 5 => 4.5 final l=2, r=1 在范围里但是没有查找到
                # 5=>4 final l=0, r=-1 不在范围里
                # 4=>5 final l=1, r=0 不在范围里
            
            l = 0
            r = len(numbers)-1
            while l < r:
                found, j = bsearch(numbers, target-numbers[l], l+1, r)
                if found:
                    return [l+1, j+1]
                else:
                    l += 1
                    r = j
            return []        
            
  • 相关阅读:
    求大神回答这个管理系统不知道为啥不成功急!
    这个函数到底什么意思如何调用
    判断浮点数是否为零的问题
    字符串与列表的 常用方法
    变量名命名规范 运算符 流程控制
    ACM C++
    struts s:iterator循环遍历数据 自动生成序号
    JAVA将一个EXCEL多行订单产品字符串分解成一个个子订单 +连接符连接
    JS在HTML中获取到所有选中的checkbox的值
    自己做的java-WEB项目。希望360浏览器能够默认使用极速模式打开
  • 原文地址:https://www.cnblogs.com/bonelee/p/8667246.html
Copyright © 2011-2022 走看看