前天开始刷leetcode,所以打算把代码和一些思路写在这里吧。本身自己就是菜鸟,就从easy开始做,大部分都是可以直接想到思路的。先把这几天的上传上来。
#1
Two Sum
给出整型数组和一个数,找到数组中两个相加为该数的不同数的索引,答案唯一。
1、暴力法
暴力法就是逐个去遍历该元素和后面的元素之和,找到则返回即可。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int numSize=nums.size();
bool flag=0;
vector<int> resultnums;
for(int i=0;i<numSize;i++)
{
if(flag) break;
for(int j=i+1;j<numSize;j++)
{
if(nums[i]+nums[j]==target)
{
resultnums.push_back(i);
resultnums.push_back(j);
flag=true;
break;
}
}
}
return resultnums;
}
};
2、哈希表
unordered_map<>
map内部实现的是红黑树(非严格平衡二叉树,AVL是严格平衡二叉树),元素存放有序。map中的元素是按照二叉搜索树进行存放(左子树节点的值小于根节点的值,右子树的值大于根节点的值)。因此对map使用中序遍历就可以从小到大遍历了。
unordered_map内部实现的其实是一个哈希表,查找复杂度O(1),元素存放是无序的。
相关方法:
1)使用{}赋值,map<int,string> Mymap={{1,''你好''},{2,''大家好''}};
2)访问:Mymap[键值]
3)使用pair插入:Mymap.insert(pair<int,string>(3,''再见''))
4)使用find查找,若找到则返回迭代器指向键值为key的元素,若没有找到,则返回end()
it=Mymap.find(2); *it输出“大家好”即可。 查找是通过键key查找的!!
对于该题,想法就是插入补数(target-数组元素):遍历,先查找哈希表中有无该数的键,若没有,则插入索引和该数的补数组成的pair<int,int>第一个是补数,第二是索引(因为结果是要找到索引,所以索引才是我们关注的value)。若有,则通过键去访问value得到索引即可。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
//使用hash表
std::unordered_map<int, int> hash_map;
std::pair<int,int>pairs;
int numSize=nums.size();
vector<int> resultNum;
for(int i=0;i<numSize;i++)
{
if(hash_map.find(nums[i])!=hash_map.end()) //通过键值key查找,若找到插值
{
//resultNum[0]=hash_map.find(nums[i]); //查找成功,返回key迭代器
resultNum.push_back(hash_map[nums[i]]);//查找成功,用键值去访问读取value值
resultNum.push_back(i);
return resultNum;
}
else
{
//没找到,则插入pair,其值是target与num的差值
pairs.first=target-nums[i];
pairs.second=i;
hash_map.insert(pairs);
}
}
return resultNum;
}
};