![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
hash
文章平均质量分 61
Lzed
我好菜啊
展开
-
Leetcode 381 - Insert Delete GetRandom O(1) - Duplicates allowed
题意同380 - Insert Delete GetRandom O(1),只不过支持重复元素。思路pre我们先考虑还是用unordered_map+vector来做,既然支持重复元素,那么我们可以将重复元素穿成一条链,即unordered_map的结构为unordered_map<int, vector<int>> has,其中vector存储的为对应在arr里的下标。insert(val):原创 2017-02-27 20:02:53 · 335 阅读 · 0 评论 -
Leetcode 454 - 4Sum II(hash)
题意给4个长度相同的数组,在每个数组里面选一个数,使它们的和加起来为0。问一共有多少方案?思路最先想的是O(n3logn)O(n^3logn)的。就ABC枚举一下,D二分一下。但是,我们可以考虑:先将AB的所有和n2n^2枚举一下放到一个新数组a里面,CD的和n2n^2加入到unordered_map里面,然后遍历a里面的元素,去unordered_map里面O(1)O(1)查找一下就好了。时间复杂原创 2017-02-10 23:35:59 · 207 阅读 · 0 评论 -
Leetcode 219 - Contains Duplicate II(hash or sort)
题意给定一个数组nums和一个数k,判断是否存在numsi=numsjnums_i = nums_j且|j−i|≤k|j - i| \leq k。思路算法1建立一个pair<int, int>为numsinums_i和ii,我们排序O(nlogn)O(nlogn)排序后遍历一遍就可以了。算法2用unordered_map存储元素x最后一次出现的下标,每次O(1)O(1)的去查找和判断就可以了。时间复原创 2017-02-15 22:59:22 · 189 阅读 · 0 评论 -
Leetcode 128 - Longest Consecutive Sequence
题意给一个数组,求这个数组中一个最大的子集,要求其是连续的。要求:O(n)O(n)时间思路首先,显然不能排序了。 我们考虑把这个数插入到unordered_set里面。假设我们从数组中选一个数x作为子集的一部分,那么我们需要找一个区间[l,r][l, r],使x∈[l,r]x \in [l, r]且[l,r][l, r]里面的所有数都应该在数组中出现过。判断一个数是否出现过,我们可以直接在unode原创 2017-02-25 15:42:32 · 249 阅读 · 0 评论 -
Leetcode 380 - Insert Delete GetRandom O(1)
题意设计一个数结构,支持:insert(x):O(1)O(1)插入元素x,如果已经存在返回falseremove(x):O(1)O(1)删除元素x,如果x不存在返回falsegetRandom():O(1)O(1)的等概率从里面随机返回一个元素思路unordered_map支持O(1)O(1)插入和删除,只需要O(1)O(1)的随机返回元素。我们用一个数组映射一下,用arr[pos] = x原创 2017-02-27 08:44:53 · 215 阅读 · 0 评论 -
Leetcode 49 - Group Anagrams(hash)
题意给一组字符串,要求将里面的anagram分组。样例:["eat", "tea", "tan", "ate", "nat", "bat"]思路暴力的思路算法设置一个vector<vector<int>> v,第二维大小为26,代表的一个字符串中各个字母出现的次数。对于每个新加入的str,遍历v,看是否存在已经满足的映射,如果没有,就在v里面建立新的映射。如果有,找到v里面对应的位置,并且在an原创 2017-03-31 15:19:09 · 258 阅读 · 0 评论 -
Leetcode 146 - LRU Cache(HashMap + List)
题意实现LRU缓存(Least Recently Used)。 要求:所有操作都是O(1)O(1)的。 LRU缓存机制:假设我们能够缓存的数目为n。在加入新元素时:当容量小于n时,我们直接加入新元素;若容量已经达到n,我们置换出最久没有使用的那个元素,并且加入我们的新元素。 思路HashMap + list。 我们需要支持的操作是put(int key, int value)和get(int原创 2017-03-12 19:39:58 · 268 阅读 · 0 评论 -
Leetcode 554 - Brick Wall(HashMap)
题意一个m行的墙,每行由若干个大小不一的砖垒起来的。现在要求找:一条线竖着穿过这面墙,并且穿过最少的砖(横穿,从砖的边上穿过不算)。思路首先,最直接的思路是枚举一下横着穿过的坐标,但是宽度最大到INT_MAX,所以不行。因为所有的砖最多只有只有20000个,所以我们可以枚举砖的边缘。算法1枚举每一行的所有砖的边缘xx,然后判断从这个地方切开会划开几个砖。在求会划开几个砖的时候:维护每一行砖的前缀和,原创 2017-04-18 15:05:24 · 357 阅读 · 0 评论