给定一个整数数组 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
解法一:
c++暴力破解
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int i=0,j=0;
int len=nums.size()-1;
for(i=0;i<len;i++)
for(j=i+1;j<len+1;j++)
if(nums[j]+nums[i]==target )
return{i,j};
return{0};
}
};
在尝试进行暴力破解时充分意识到了我的c++基础有多么薄弱
以下是学习笔记
vector
,向量,一个封装了动态大小数组的顺序容器,它能够存放各种类型的对象。可简单的认为向量是一个能够存放任意类型的动态数组
它具有以下特性
1.顺序序列
顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。
2.动态数组
支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。
3.能够感知内存分配器的(Allocator-aware)
容器使用一个内存分配器对象来动态地处理它的存储需求。
*调用时需要#include < vector>
,无.h
具体含义:
vector<类型>标识符(最大容量,初始所有值)
vector<int> twoSum(vector<int>& nums, int target)
即一个int
类型名字为twoSum
容量引用nums
大小,初始值为target
资料地址
https://www.runoob.com/w3cnote/cpp-vector-container-analysis.html
解法2:
哈希表遍历
首先什么叫做哈希表(怀想天空2015 哈希表(散列表)原理详解)
一种寻址容易,插入删除也容易的结构,同时融合了数组和链表的特点。
对数据进行函数处理后可得到一一对应的key值,这样在数据所以是只需计算出key即可得到位置而不需要遍历查找
哈希表的实现
经过学习发现大部分答案用的是map函数实现。
map的构造函数为
map<string , int >mapstring;
map<int ,string >mapint;
map<sring, char>mapstring;
map< char ,string>mapchar;
map<char ,int>mapchar;
map<int ,char >mapint;
一般常用map<int ,string>mapint
*调用时需要#include <map>
,无.h
map的数据添加:
map<int ,string> maplive;
1.maplive.insert(pair<int,string>(102,"aclive"));
2.maplive.insert(map<int,string>::value_type(321,"hai"));
3.maplive[112]="April";
3、map中元素的查找:
find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。
map<int ,string >::iterator l_it;;
l_it=maplive.find(112);
if(l_it==maplive.end())
cout<<"we do not find 112"<<endl;
else cout<<"we find 112"<<endl;
因为本题中可以直接拿nums中数据直接作为key值
哈希表函数借鉴的soulmate______的方法:https://blog.csdn.net/soulmate______/article/details/104585380
同时在此感谢@soulmate______本人对我的帮助!
class Solution
{public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> Hash;
for(int i=0;i<nums.size();i++){
Hash[nums[i]]=i; //将nums导入哈希表
}
for(int i=0;i<nums.size();i++){
if(Hash.find(target-nums[i])!=Hash.end()&&Hash[target-nums[i]]!=i) //直接进行寻找是否存在使其加上i等于target&&不是它本身
{
return{i,Hash[target-nums[i]]};
}
}
return {};
}
};
路还很长,再接再厉!