1、两数相加

2019-08-17  本文已影响0人  MR_Model

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

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

示例:

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

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:
1.暴力求解:
如题,需要在一个nums数组中找到和为target的两个整数的下标,最简单的思路就是通过二重遍历,遇到这种情况的时候,直接输出当时的两个下表值。

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

运行结果: 执行时间:228 ms 执行内存:9.2 MB

2.使用空间换取时间的解法。
首先,暴力法做了很多的无用功,枚举出了所有的方法,时间复杂度应该在 n*n。
首先,计算值的和,需要数组的值;输出下标,需要数组的下标。我们需要建立一个值和下标的关系。其中最简单的应该就是哈希表,即map。

我们在一次循环的时候,将实际情况分成两种情况:
我们首先创建一个map,用来存储遍历过后的值和下标的关系。
1.首先计算出,需要数字X,可以和当前的值Y加起来得到target
2.然后在map中查找是否存在数字X
3.不存在,将当前的值Y和Y的下标存在map中,其中Y为key值,Y的下标为value值。
4.如果存在这样的值,则直接输出数字X对应的下标,同时当前的值Y的下标,完成任务。
5.如果一直不存在,直接输出空数组。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int>res;
        map<int, int> tmp;
        for (int i =0 ; i < nums.size(); i++) {
            int temp = target - nums[i];
            if (tmp.find(temp) != tmp.end()) {
                res.push_back(tmp.find(temp)->second);
                res.push_back(i);
                break;
            } else {
                tmp.insert(std::pair<int,int>(nums[i], i));
            }
        }
        return res;
    }
};

运行结果: 执行时间:8 ms 执行内存: 10.1 MB

上一篇下一篇

猜你喜欢

热点阅读