1-两数之和

1-两数之和

1.题目

LeetCode-1-两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

2.标准答案

LeetCode-1-两数之和-官方题解

暴力求解 O(n^2)
哈希函数 O(n)

3.心得

一般初见这题,都会直接想到暴力解法,上手就是两重循环。
由于我是第一次使用LeetCode,而且我对C++STL的使用不够熟练(其实也就是刚学),所以我这道题的重点主要放在了熟悉LeetCode的机制以及STL的使用上(我会之后写几篇关于LeetCode的使用方法和STL的学习笔记)。
我能理解使用哈希函数的方法,但是官方题解使用的是STL里自带的map,我对于官方解法看了觉得很奇怪,我现在也说不上来哪里奇怪(菜啊)。
但是!我在官方题解的评论下方找到了一种神一样的题解!

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int volume =2048; //100000000000 
        int bitMode = volume-1;//011111111111 
        vector<int> result(volume,0);
        vector<int> a;
        for (int i=0;i<nums.size();i++)
        {
            int c = (target - nums[i]) & bitMode;
            if (result[c]!=0)
            {
                a.push_back(result[c]-1);
                a.push_back(i);
                return a;
            }
            result[nums[i] & bitMode]=i+1;
        }
        return a;       
    }
};

利用int的机器级表示,按位与所有位都是1的bitMode,模拟一个哈希函数。
这样该哈希函数为H(x)=target-x。
只需要遍历一次输入,每次遍历哈希一次,每次检查哈希表上是否存在值,存在即得结果。
太牛了。

posted @ 2019-12-29 22:01  AAA_BiteTheDust  阅读(136)  评论(0)    收藏  举报