【LeetCode简单题】-两数之和

Task:

【LeetCode简单题】-两数之和_第1张图片

思路:

  1. 暴力算法:
    时间复杂度是O(n2)
    (1)遍历整个数组找到nums[i]
    (2)从nums[i]之后的元素开始遍历,得到nums[j]
    (3)判断nums[i]和nums[j]的值是不是相等,如果是的话返回两个下标

  2. Hash Map的解题思路:

(1)建立存放结果的向量result;
(2)构建一个一一对应的map,都是int类型
(3)遍历数组
a)记录每一个数组元素的对应的补集,也就是对应的目标数减去当前遍历到的元素的值;
b)然后对该值在map中查找,如果找到了,那就把当前正在遍历的元素的补充元素的索引以及当前元素的索引push_back到存放结果的向量中;
c)如果没有找到,那就把当前元素的索引值和当前元素在map之中对应起来
d)思考:也就是说如果在这个过程中不是在第一步就找到了,那就会每循环一次,使得map中的“对儿”多一对,直到找到这样的结果!
(4)最后返回我们要的结果

代码

  1. 暴力法代码:
class Solution {
public:
    vector twoSum(vector& nums, int target) {
        int i,j;
        for(int i=0; i
  1. 哈希map法的代码:
class Solution {
public:
    vector twoSum(vector& nums, int target) 
    {
        vector  result;
        map 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的理解还不行!今天解决掉!

提交结果:

  1. 暴力法结果:
    【LeetCode简单题】-两数之和_第2张图片

  2. 哈希Map法的提交结果:
    【LeetCode简单题】-两数之和_第3张图片
    可以看出来利用hash表之后程序执行的时间明显的下降了!说明降低了时间复杂度!

你可能感兴趣的:(C/C++学习,leetCode,LeetCode刷题系列)