LeetCode实战001 两数之和

2019-05-06  本文已影响0人  Rooooyy

原题链接

题目描述

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

输入示例:

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

输出:

[0, 1]

思路解读

题目不难理解,给定的输入是一个数组nums和整数target,需要找到nums[i]+nums[j]==target,并返回i, j

假设的含义是,当你找到了这样一组ij时,可以立即返回,同时要注意返回的索引值不能相同。

解法一:暴力循环

这个解法应该是像我这样的菜鸡能想到的第一个方法。两个循环嵌套,第一个循环遍历数组,每次取出的元素假设叫x,第二个循环则是遍历数组剩余部分,查找是否存在target-x这个元素。

显然,这个解法的时间复杂度是O(n^2),空间复杂度是O(1)

#include <iostream>
#include <vector>
using namespace std;

class Solution{
public:
    //暴力解法 
    vector<int> twoSum(vector<int> &nums, int target){
        vector<int> idx;
        vector<int>::iterator i = nums.begin();
        while(i != nums.end()-1)
        {
            vector<int>::iterator j = i+1;
            while(j!=nums.end())
            {
                if(*i + *j==target)
                {
                    idx.push_back(i-nums.begin());
                    idx.push_back(j-nums.begin());
                    return idx;
                }
                j++;
            }
            i++;
        }
        return idx;
    }
};

这个方法比较简单,不再用注释解释思路。虽然思路比较简单,由于题目要求用stl求解,第一次接触还是花了很久,这里说一下需要注意的点:

解法二: 一遍哈希表法

在遍历数组时,可以一边将元素存入哈希表,一边从已存入的值中查找目标解。

#include <iostream>
#include <vector>
#include <map> 
using namespace std;

class Solution{
public:
    //一遍map解法 
    vector<int> twoSum(vector<int>& nums, int target) {
        map<int, int> map;
        for(int i=0; i<nums.size(); i++){
            int x = target - nums[i];//x是目标值
            //在这里数组的元素是map的key,数组的下标才是map的value
            //find(x)是查找是否有key==x,并返回以key开始的迭代器
            //如果想要得到value,则需访问second成员
            if(map.find(x)!=map.end())
                return {map.find(x)->second, i};
            map[nums[i]]=i; 
        }
        return{};
    }   
};

时间复杂度:O(n),因为只遍历了数组一次,且find()函数只需O(1)的时间。

空间复杂度:O(n),因为需要用map来存储数组元素。

上一篇 下一篇

猜你喜欢

热点阅读