001 Two Sum

001 TWO SUM

https://leetcode-cn.com/problems/two-sum/

方法一:暴力法

C++代码


// 暴力法
// 时间复杂度:O(n2)
// 空间复杂度:O(1)
class Solution {
public:
    vector twoSum(vector& nums, int target) {
        int i, j;
        for (i = 0;i < (int)nums.size()-1;i++) {
            int tmp = target - nums[i];
            for (j = i + 1; j < (int)nums.size();j++) {
                if (nums[j] == tmp) {
                    return { i,j };
                }
            }
        }
        return { i,j };
    }
};

思路

解法本身的思路是遍历两遍,拿着第一遍的值(i)去后续数字中寻找与目标(target)的差值。然而实际上这就是一种查找,所以有了后续为了减少时间代价而使用的hash表的方法

方法二:两次哈希表

C++代码


// 法2 两遍哈希表
class Solution {
public:
    vector twoSum(vector& nums, int target) {
        unordered_map hash;
        for (int i = 0;i < (int)nums.size();i++) {
            hash[nums[i]] = i;
        }
        for (int i = 0;i < (int)nums.size();i++) {
            int tmp = target - nums[i];
            if ((hash.find(tmp) != hash.end())&&(hash[tmp]!=i)) {
                return  { i,hash[tmp] };
            }
        }
        return { 0,0 };
    }
};

思路

解法本身的思路是遍历两遍,拿着第一遍的值(i)去后续数字中寻找与目标(target)的差值。但是查找的方式与之前的暴力法不同,这种方法事先第一次遍历将所有的值插入hash表中,所以查找时非常高效

方法三:一遍哈希表

C++代码


class Solution {
public:
    vector twoSum(vector& nums, int target) {
        unordered_map hash;
        for (int i = 0;i < (int)nums.size();i++) {
            int tmp = target - nums[i];
            if ((hash.find(tmp) != hash.end()) && (hash[tmp] != i)) {
                return  { i,hash[tmp] };
            }else {
                hash[nums[i]] = i;
            }
        }
        return { 0,0 };
    }
};

思路

只是上一种方法的简单提升,为什么不在插入过程中先检测下已经插入的部分是否有答案呢,这段代码把之前的代码分开做的事一起完成

低级错误和收获:

这一题是LEETCODE最简单的一题,但是这个引出了哈希查找这一算法的研究,也让我在专业书上重新去看了C++中对应的语法,才到一半,看之后的内容前会优先看完。
头文件是

#include  //情况不同加 multi、unorederd_

hash表的查找效率非常高,接近O(1),是一种用空间换执行时间的方法

你可能感兴趣的:(001 Two Sum)