LeetCode 1.Two Sum

leetcode的第一题,two sum:

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.

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,

return [0, 1].

Custom Testcase :

[3,2,4]
6

题解:

仔细观察题意,two numbers, have exactly one solution。

可以了解到:

1.只有两个数字相加,并没有多个数字

2.数组中只有一对数的和正好与target相等,只有一个解。

我刚开始做的时候想的是不管用时怎么样,先ac了再说,所以用的是比较笨的方法就是直接两个循环,判断数组中两个数的和是否与target相等

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> ret;
        for(int i = 0; i < nums.size(); i++)
        for(int j = i + 1; j < nums.size(); j++)
        {
            if(nums[i] + nums[j] == target)
            {
                ret = {i,j};
                break;
            }
        }
        return ret;
    }
};

ac之后算法效率果然惨不忍睹:

于是开始提高算法效率

想到以前上算法实验课时,TA有说可以使用STL中的函数就用STL中的函数,因为STL的实现是用binary tree实现的。所以想到了用find函数。但是直接用vector的find函数,返回的是iterator,而不是index,所以使用map,另外一个存储index。代码如下:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> ret;
        map<int, int> nuins;
        for(int i = 0; i < nums.size(); i++)
        {
            
            map<int,int>::iterator it = nuins.find(target - nums[i]);
            if(it != nuins.end())
            {
                ret = {it->second,i};
                break;
            }
            nuins.insert(pair<int, int>(nums[i],i));
        }
        return ret;
    }
};

 

其中在刚开始的时候,我犯了一个错误,就是将insert放在了if条件语句前,这样就导致错误,因为有可能target等于某个数的两倍。

而这份代码在ac之后,效率明显上升了:

 

但是还是没有达到最多人实现的那个效率,所以还将继续改进算法。

 在这之后看到了discussion,发现以下代码的效率更高:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> ret;
        unordered_multimap<int, int> nuins;
        for(int i = 0; i < nums.size(); i++)
        {
            
            unordered_multimap<int,int>::iterator it = nuins.find(target - nums[i]);
            if(it != nuins.end())
            {
                ret = {it->second,i};
                break;
            }
            nuins.insert(pair<int, int>(nums[i],i));
        }
        return ret;
    }
};

效率图如下:

其中原因是unordered 的map更高效(具体原因还没有去分析),而且使用的还是mutlimap。这都是一些需要注意的细节。

 

总结:

从这道题可以知道,尽量使用STL中的函数,容器类型也要使用得当,并且对于各个容器的区别要有了解。

posted @ 2016-07-19 00:31  Attenton  阅读(177)  评论(0编辑  收藏  举报