---恢复内容开始---

参考博客:

https://www.cnblogs.com/grandyang/p/4130379.html

https://blog.csdn.net/weixin_38715903/article/details/80483609

  为了吃饭,于是就开启了leetcode的刷题之旅。其实应该在暑假就开始的,奈何个人太懒惰了,在此进行自我的检讨。

  说回正题,leetcode和之前刷的oj的格式感觉不大一样,一开始看的时候感觉很不适应,但后来其实弄清楚门路了就还好。只要把其中的函数部分提取出来用来测试就可以了,就当一般oj使用就行。

回归第一题:

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

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

    刚开始是想进行暴力搜索,但是oj的时间复杂度应该是不行的(其实这个也是别的博客说的,我等等去尝试下)。于是就想到了hashmap。其实感觉就是STL里面的map。

    具体思路:

1.对数组所有元素形成key-value形式,key为数组值,value为下标。即map[num[0]]=0,map[num[1]]=1.

2.对于nums数组里面的数,遍历,寻找是否存在,map[target-num[i]],这个值;不存在继续寻找

3.若存在这么一个值map[target-num[i]],那判断这个值的下标是不是i,也就是判断target-num[i]这个值,是不是就是num[i],本身。如果是,那就不是两个数,继续寻找。如果不是,就说明存在这么两个数,返回下标,即i和map[target-num[i]]

代码如下:

#include "pch.h"
#include <iostream>
#include <iostream>
#include<math.h>
#include <iomanip>
#include<cstdio>
#include<string>
#include<map>
#include<vector>
#include<list>
#include<algorithm>
#include<stdlib.h>
#include<iterator>
#include<sstream>
#include<string.h>
#include<stdio.h>
using namespace std;



vector<int> twoSum(vector<int>& nums, int target) {
    vector<int> res;
    map<int, int> temp;
    for (int i = 0; i < nums.size(); i++)
    {
        temp[nums[i]] = i;
    }

    for (int i = 0; i < nums.size(); i++)
    {
        if (temp.count(target-nums[i])!=0&&temp[target-nums[i]]!=i)
        {
            res.push_back(i);
            res.push_back(temp[target - nums[i]]);
            break;
        }
    }
    return res;
}

int main()
{
   //测试部分
    vector<int> a;
    vector<int> nums = {2,7,11,15};
    int target = 9;
    a = twoSum(nums, target);

    for (int i = 0; i < a.size(); i++)
    {
        cout << a[i] << endl;
    }

}