梦开始的地方,两数之和,暴力解法+hash表单次的排序
c++暴力解法:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int n = nums.size();
//设置循环的条件
int i,j;
for(i=0;i<n-1;i++){
//只需要遍历到倒数第二个即可
for(j=i+1;j<n;j++){
if(nums[i]+nums[j]==target) return {i,j};
}
}
return {i,j};
}
};
暴力解非常容易让人想到,但是时间上会用大概45ms左右,
所以可以采用哈希表的计算方法,让算法时间更加的短
接下来采用的是单个哈希表的遍历的算法
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> a;//定义一个哈希表,这里的哈希表是动态的,非定长hash
vector<int> b(2,-1);//初始化容器
for(int i =0;i<nums.size();i++){
if(a.count(target-nums[i])>0){//通过键去找出现的次数,这里的键存的是nums[i]即最终还是要用过这个来得到相对应的值得
b[0]=i;
b[1]=a[target-nums[i]];
break;
}
a[nums[i]] = i;//
}
return b;
}
};
用单个hash在我看来最精髓的地方之处是利用了其“键”的特性然后进行索引计数,最后找到值