LeetCode一道最简单的题“两数之和”

其实大一的时候就想每天做一道LeedCode的题目,但是无奈那时候基础太差,被这么一道标签为简单的题目难住了,现在快大二了倒觉得还做得下去。

首先自己还算是第一次做这个,犯了一个很大的错误,你打开一道题的时候是只有一个class,你在里面编辑解决方案,其实就可以了。我之前就连带着把main函数也写在后面了,于是出现了这样的错误:
conflicting declaration of C function ‘int main(int, char*)’*
找了很久,才意识到不需要写main函数,有点让人无语。
然后再来说这道题是怎么解的:
很简单,就是两个遍历,不过这个并不是最好的算法,复杂度为O(n^2);

#include 
#include 
using namespace std;
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
       vector<int> result;
        for(int i=0;ifor(int j=i+1;jif(nums[i]+nums[j]==target){
                   result.push_back(i);
                    result.push_back(j);
                    return result;
                }
            }
        } 
    }
    };

然后再来说说网站上给的标准答案

方法一 暴力遍历

public int[] twoSum(int[] nums, int target) {
    for (int i = 0; i < nums.length; i++) {
        for (int j = i + 1; j < nums.length; j++) {
            if (nums[j] == target - nums[i]) {
                return new int[] { i, j };
            }
        }
    }
    throw new IllegalArgumentException("No two sum solution");
}

现在java刚开始学还不太能看懂emmm,但是参考答案都是java

方法二 两遍哈希表
2333其实我还不明白哈希表是什么,数据结构还在学习中orz,于是百度了一下,他是这么说的

在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应。

我暂时的理解是,它跟数组的区别是,,,数组没有对应关系?下面这张图是从引用的那个博客里拿过来的,感觉这个比较明白,蔬果换成简单的数组,就是key和value只有对应而不存在关系这一说,也就是说,是不能通过计算得出的。

LeetCode一道最简单的题“两数之和”_第1张图片

其实说了这么半天,这个题目对哈希表的理解似乎并不重要,他的思想就是想办法把两个循环拆开,怎么拆呢,先看一下代码吧

public int[] twoSum(int[] nums, int target) {
    Map map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        map.put(nums[i], i);
    }
    for (int i = 0; i < nums.length; i++) {
        int complement = target - nums[i];
        if (map.containsKey(complement) && map.get(complement) != i) {
            return new int[] { i, map.get(complement) };
        }
    }
    throw new IllegalArgumentException("No two sum solution");
}

第一个循环是建立哈希表,将元素的值和他的索引添加到表中,第二个循环就是在表中对每一个元素找与他“互补的元素”在不在表中,两个循环并没有嵌套,但你仔细想想,这两种方法思路是一样的。用了一个哈希表,复杂度就降到了O(n).实在是太厉害了!

方法三 一遍哈希表

更厉害的永远在后面哈哈哈哈,先上代码。

public int[] twoSum(int[] nums, int target) {
    Map map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        int complement = target - nums[i];
        if (map.containsKey(complement)) {
            return new int[] { map.get(complement), i };
        }
        map.put(nums[i], i);
    }
    throw new IllegalArgumentException("No two sum solution");
}

也就是方法二中的两个循环同时进行,emmm其实map的用法我还不太熟,真是惭愧惭愧,所以就大概理解一下,希望以后java和C++学的更6的时候能看的更明白哈哈哈
加油!!

你可能感兴趣的:(LeetCode笔记)