leetcode之两数之和

不问归期 提交于 2020-02-28 06:02:51

废弃很久的博客,终于从灰尘中捡起来了。摸鱼近一年,最终研果真没希望考上了。还是老老实实挨社会的毒打吧。leetcode刷题好平台,先用它来熟悉很久未上手的算法吧!

两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

题解

求和是二元的,两个循环刚好对应二元未知。直接暴力?
当然不可能,只用一个循环找数num,另一个数用target - num表示。
每遍历一个数,就把数num和数num的索引号ind放入一个字典dic中。
每次遍历时,都看看字典dic中是否有target-num这个数,如果有,那么就找到了x + y = target这个公式了。

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dic = {}
        for ind, num in enumerate(nums):
            tmp = target-num
            if tmp in dic:
                return (dic[tmp], ind)
            dic[num] = ind

以上是大佬的思路,简单明了44ms/14.6MB
下面是懵逼的我写的另一种思路,没用到字典,思路也就差不多,太过复杂:976ms/14MB

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        ln = len(nums)
        for i in range(ln):
            tmp = target - nums[i]
            cnt = nums.count(tmp)
            if (tmp == nums[i] and cnt>=2) or (tmp!=nums[i] and cnt>0):
                a = i
                b = nums[i+1:].index(tmp)+i+1
                return (a, b)

翻译成C++如下16ms/13MB

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        map<int, int> dict;
        map<int, int>::iterator it;
        int other;
        for(int i=0; i<nums.size(); i++){
            other = target - nums[i];
            if(dict[other]!=0) {
                return {dict[other]-1, i};
                
            }
            dict[nums[i]] = i+1;
        }
        return {NULL, NULL};
    }
};

数据感人,还待优化。。。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!