Leetcode 01 两数之和

83 阅读1分钟

GitHub-LT-03-源码 :large_blue_diamond:哈希表

问题描述

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

解法1: 双循环-最容易理解

  • 执行用时:432 ms, 在所有 C++ 提交中击败了40.88%的用户
  • 内存消耗:7 MB, 在所有 C++ 提交中击败了100.00%的用户

算法复杂度 O(n*n) 双重循环

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        //* 双循环,先假定一个,找目标值和当前的值的差值在剩下的数组中是否相等.
        for (int i = 0; i < nums.size(); i++) {
            int left = target - nums[i];
            for (int j = i + 1; j < nums.size(); j++) {
                if (left == nums[j]) {
                    return { i,j };
                }
            }
        }
        return { -1,-1 };
    }
};

解法2 利用哈希表的查找 - O(1)

  • 执行用时:16 ms, 在所有 C++ 提交中击败了71.05%的用户
  • 内存消耗:8.4 MB, 在所有 C++ 提交中击败了43.22%的用户

算法复杂度 O(n) 只需遍历一遍即可

class Solution2 {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        size_t size = nums.size();
        unordered_map<int, int> mymap;//比map(有序,红黑树)快 unorder_map(无序,哈希表)

        for (int i = 0; i < size; i++)//构造map 差值做key index作为value
            mymap.insert({ nums[i],i });

        for (int i = 0; i < size; i++) {//找
            auto it = mymap.find(target - nums[i]);
            if (it != mymap.end() and it->second != i)
                return { i,mymap[target - nums[i]] };
        }
        return { 0,0 };

    }
};