Task:
思路:
-
暴力算法:
时间复杂度是O(n2)
(1)遍历整个数组找到nums[i]
(2)从nums[i]之后的元素开始遍历,得到nums[j]
(3)判断nums[i]和nums[j]的值是不是相等,如果是的话返回两个下标 -
Hash Map的解题思路:
(1)建立存放结果的向量result;
(2)构建一个一一对应的map,都是int类型
(3)遍历数组
a)记录每一个数组元素的对应的补集,也就是对应的目标数减去当前遍历到的元素的值;
b)然后对该值在map中查找,如果找到了,那就把当前正在遍历的元素的补充元素的索引以及当前元素的索引push_back到存放结果的向量中;
c)如果没有找到,那就把当前元素的索引值和当前元素在map之中对应起来
d)思考:也就是说如果在这个过程中不是在第一步就找到了,那就会每循环一次,使得map中的“对儿”多一对,直到找到这样的结果!
(4)最后返回我们要的结果
代码
- 暴力法代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int i,j;
for(int i=0; i<nums.size()-1; i++){
for(int j=i+1; j<nums.size(); j++){
if(nums[i]+nums[j] == target)
return {i,j};
}
}
return {i,j};
}
};
- 哈希map法的代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target)
{
vector <int> result;
map<int,int> maps;// 提供1对1的hash,索引值是int,关联的值为int
for( int i = 0; i < nums.size(); i++)
{
int complement = target - nums[i];
if( maps.find(complement) != maps.end()) //find,如果找到则返回的是被查找元素的位置,否则返回map::end()位置
{ //所以就是如果找到了那就进行下面的操作,如果没找到,那就把i的值给对应到当前i的值的map中
result.push_back(maps[complement]);
result.push_back(i);
}
maps[nums[i]] = i; // 插入默认初始化元素的key值nums[i],然后给对应的值设置为i
}
return result;
}
};
但是这里我对map的理解还不行!今天解决掉!
提交结果:
-
暴力法结果:
-
哈希Map法的提交结果:
可以看出来利用hash表之后程序执行的时间明显的下降了!说明降低了时间复杂度!