哈希表 = 散列表

key:value 键值对

python的哈希表就是字典,c++是std::map

哈希碰撞:两个不同的key通过同一个哈希函数得到了相同的内存地址

哈希表中不存在访问

搜索O(1)如果发生哈希碰撞他的时间复杂度就是O(K)k是碰撞的元素个数

插入O(1)

删除O(1)

常用操作:

1.创建哈希表

2.添加元素

3.删除元素

4.修改元素

5.获取key的值

6.检查key是否存在

7.哈希表长度

8.哈希表是否还有元素

217

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。
 

示例 1:

输入:nums = [1,2,3,1]
输出:true
示例 2:

输入:nums = [1,2,3,4]
输出:false
示例 3:

输入:nums = [1,1,1,3,3,4,3,2,4,2]
输出:true
 

提示:

1 <= nums.length <= 105
-109 <= nums[i] <= 109

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        map<int, int> hash_map;
        for (auto i = nums.begin(); i != nums.end(); ++i)
        {
            if (hash_map[*i] == 0)
            {
                hash_map[*i] = 1;
            }
            else
            {
                return true;
            }
        }
        return false;
    }
};

 

389

给定两个字符串 s 和 t ,它们只包含小写字母。

字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。

请找出在 t 中被添加的字母。

 

示例 1:

输入:s = "abcd", t = "abcde"
输出:"e"
解释:'e' 是那个被添加的字母。
示例 2:

输入:s = "", t = "y"
输出:"y"
 

提示:

0 <= s.length <= 1000
t.length == s.length + 1
s 和 t 只包含小写字母

class Solution {
public:
    char findTheDifference(string s, string t) {
        map<char, int> hash_map;
        for (size_t i = 0; i < t.size(); ++i)
        {
            hash_map[t[i]] += 1;
        }
        for (size_t i = 0; i < s.size(); ++i)
        {
            hash_map[s[i]] -= 1;
        }
        for (size_t i = 0; i < t.size(); ++i)
        {
            if (hash_map[t[i]] != 0)
            {
                return t[i];
            }
        }
        return ' ';
    }
};

 

496

nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。

给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。

对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。

返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素 。

 

示例 1:

输入:nums1 = [4,1,2], nums2 = [1,3,4,2].
输出:[-1,3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:
- 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
- 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3 。
- 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
示例 2:

输入:nums1 = [2,4], nums2 = [1,2,3,4].
输出:[3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:
- 2 ,用加粗斜体标识,nums2 = [1,2,3,4]。下一个更大元素是 3 。
- 4 ,用加粗斜体标识,nums2 = [1,2,3,4]。不存在下一个更大元素,所以答案是 -1 。
 

提示:

1 <= nums1.length <= nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 104
nums1和nums2中所有整数 互不相同
nums1 中的所有整数同样出现在 nums2 中

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        vector<int> rslt;
        map<int, int> hash_map;
        for (size_t i = 0; i < nums1.size(); ++i)
        {
            rslt.push_back(-1);
        }
        for (size_t i = 0; i < nums2.size(); ++i)
        {
            hash_map[nums2[i]] = i;
        }
        for (size_t i = 0; i < nums1.size(); ++i)
        {
            for (size_t j = hash_map[nums1[i]]; j < nums2.size(); ++j)
            {
                if (nums2[j] > nums1[i])
                {
                    rslt[i] = nums2[j];
                    break;
                }
            }
        }
        return rslt;
    }
};

 

无情的摸鱼机器