• [算法题] Two Sum


     题目内容

    题目来源:LeetCode

    Given an array of integers, return indices of the two numbers such that they add up to a specific target.

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

    Example:

    Given nums = [2, 7, 11, 15], target = 9,
    
    Because nums[0] + nums[1] = 2 + 7 = 9,
    return [0, 1].
    

    题目思路

    题目难度:easy

    虽然这个题目不属于难题,但是它是k-sum系列问题的核心。因此详细地在此总结。

    做本题有三种方法:

    第一种是最容易想到的暴力搜索,用两个循环嵌套,不采用此方法。

    第二种是哈希法

    第三种是双指针法

    哈希法

    本质的思路是:对于每一个nums[i],寻找剩下的数组中是否存在target-nums[i]。若存在,直接返回其下标就好。否则继续寻找,直到全部查找完毕,返回空。在Python中,可以直接使用dict这个数据结构来存储元素和下标的对应关系。每次判断完后,将这个数加入到dict中。

    哈希法的Python代码

    class Solution(object):
        def twoSum(self, nums, target):
            """
            :type nums: List[int]
            :type target: int
            :rtype: List[int]
            """
            d={}
            for i in range(len(nums)):
                if target-nums[i] in d:
                    return (d[target-nums[i]],i)
                d[nums[i]]=i

    双指针法

    双指针法的思路是,先将数组nums进行排序,然后分别设立两个指针,一个指向第一个元素,另一个指向最后一个元素。每次判断指针指向的这两个数的和,若它们的和大于target,那么将左边的指针加一,如果小于target,那么将右边的指针减一。如果等于target,就输出。其实这是一种从两边夹逼的思想。这个题目要求返回的是下标而不是值,因此多了很多操作,如果仅仅是要求返回值,那么就会简洁多了。

    双指针Python代码

    class Solution:
        # @return a tuple, (index1, index2)
        def twoSum(self, num, target):
            index = []
            numtosort = num[:]; numtosort.sort()
            i = 0; j = len(numtosort) - 1
            while i < j:
                if numtosort[i] + numtosort[j] == target:
                    for k in range(0,len(num)):
                        if num[k] == numtosort[i]:
                            index.append(k)
                            break
                    for k in range(len(num)-1,-1,-1):
                        if num[k] == numtosort[j]:
                            index.append(k)
                            break
                    index.sort()
                    break
                elif numtosort[i] + numtosort[j] < target:
                    i = i + 1
                elif numtosort[i] + numtosort[j] > target:
                    j = j - 1
    
            return (index[0]+1,index[1]+1)

    (双指针的代码自己没编,来源于: http://www.cnblogs.com/zuoyuan/p/3698966.html)

  • 相关阅读:
    运维IT必备程序安装包
    网络基础TCP三次握手四次挥手
    新建Weblogic域启动报BEA090403和BEA000386提示密码认证有问题
    Weblogic开发模式和生产产品模式互换
    web api 返回 去除双引号转义符
    freeswitch esl :Rejected by acl “loopback.auto“问题
    freeswitch SIP 服务器一些常用配置
    因果推断综述
    Django 项目配置拆分独立
    wayne编译支持k8s1.16+
  • 原文地址:https://www.cnblogs.com/chengyuanqi/p/7121126.html
Copyright © 2020-2023  润新知