第一天开始学习!!!!大家多交流一起努力!!!!
**
引言
**
今天是刷lc的开始,也是真正进入学习的第一天!所以我下了一个决定,从今天开始写博客,不仅是为了激励自己能够坚持下去,通过博客的方式复习、熟练今天所做的题目,也为了结实更多的朋友,学习经验,争取早日实现梦想!
废话不多说,今天因为刚开始时间有限,只做了一个题,如下!
今天的小试牛刀
题目表述:
如题目所示,题目要求找出对应于目标值的两个索引值,第一遍当然采用暴力解法先解出题目再说,大致如下:
暴力解法
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> answer;
for(int i=0;i<nums.size();i++){
for(int j=i+1;j<nums.size();j++){
if((nums.at(i)+nums.at(j)) == target){
answer.push_back(i);
answer.push_back(j);
return answer;
}
}
}
return answer;
}
很简单,两个循环直接暴力解法做完,当然这样的方法往往很直接,但是往往时间复杂度都会很高,我执行了一次,大致耗时是在:1508 ms,如下:
很慢,这肯定是不行的!(当然还有其他耗时没那么大的暴力法,我就不再细究了,毕竟再怎么优化,耗时都不可能降太多!)
哈希缩短时间
哈希表的定义在这里我就不再多加叙述,简而言之,就是通过关键字快速的找到值,这里用的是C++Boost库中的unordered_map,具体的用法详解见:C++ std::unordered_map 用法详解
这里不做过多叙述(因为我自己还不太熟练哈哈哈哈哈,见谅见谅!!!),优质哈希查找的时间复杂度往往都是常数级的,果然,用了这个办法后没有让我失望,成功的将耗时降到:8 ms,大约快了近200倍,虽然内存相应的多了一点,但无伤大雅啦!
废话不多说,上代码:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> hash_map;
vector<int> answer;
for(int i=0;i<nums.size();i++){
if(hash_map[target - nums.at(i)]){
answer.push_back(hash_map[target-nums.at(i)]-1);
answer.push_back(i);
break;
}
hash_map[nums.at(i)] = i+1;
}
return answer;
}
复杂度大致如下:
代码先定义需要的数据结构,像需要的unordered_map和需要输出的answer。然后通过判断需要的目标值减去当前索引的数组值的值是否已经存在于哈希表中,如果有,那么就结束!没有,就将该值赋一个地址,这里用的当前位置加1,用加法的原因也主要是为了缩短时间,因为我们都知道乘法在机器上算可能会耗时一点,如果直接用i,考虑的一个点是0对应false(当然这是小问题啦!!!)
好啦!!!今天刚开始就先只做一题!!!
俗话说万事开头难,我现在已经开头,我相信我能坚持下去的!!!
虽然说今天的第一题很简单,也很快就做完了,但是lc能被挺多人推荐,必定会有他的优点所在!!!
今天立个flag!!!从今天起每天都准时更新自己当天的做题记录(至少是两题,因为时间有限,还得复习考研 ~~~~),如果做不到,第二天不吃饭!!!
大家及时交流!!!
我还是一个小白,刚上路,多多指教!!!!