leetcode hot 100刷题记录

 1.两数之和

暴力:(还是垃圾暴力版本)

class Solution {
public:
    vector twoSum(vector& nums, int target) {
        vector ans;
        for(int i=0;i

优化暴力思路:

枚举数组中的每一个数 x,寻找数组中是否存在 target - x。

当我们使用遍历整个数组的方式寻找 target - x 时,需要注意到每一个位于 x 之前的元素都已经和 x 匹配过,因此不需要再进行匹配。而每一个元素不能被使用两次,所以我们只需要在 x 后面的元素中寻找 target - x。

class Solution {
public:
    vector twoSum(vector& nums, int target) {
        int n = nums.size();
        for (int i = 0; i < n; ++i) {
            for (int j = i + 1; j < n; ++j) {
                if (nums[i] + nums[j] == target) {
                    return {i, j};
                }
            }
        }
        return {};
    }
};

用哈希表优化:

用哈希表unordered_map  键值对分别为数组值和数组下标,注意,遍历每一个数组元素,在哈希表里找,没找到的话就将这个键值对存到哈希表里,找到了就输出。这里用的是count函数。

时间复杂度:O(N),其中 N是数组中的元素数量。对于每一个元素 x,我们可以O(1) 地寻找 target - x。

空间复杂度:O(N),其中 N是数组中的元素数量。主要为哈希表的开销。

leetcode hot 100刷题记录_第1张图片

class Solution {
public:
    vector twoSum(vector& nums, int target) {
        unordered_map hashtable;
        for (int i = 0; i < nums.size(); ++i) {
            if (hashtable.count(target-nums[i])) {
                return {hashtable[target-nums[i]], i};
            }
            hashtable[nums[i]]=i;//往哈希表里加入这个键值对
        }
        return {};
    }
};

你可能感兴趣的:(leetcode,算法,数据结构)