File tree Expand file tree Collapse file tree 1 file changed +9
-4
lines changed
Design/381.Insert-Delete-GetRandom-O1-Duplicates-allowed Expand file tree Collapse file tree 1 file changed +9
-4
lines changed Original file line number Diff line number Diff line change 11### 381.Insert-Delete-GetRandom-O1-Duplicates-allowed
22
3- 此题是380的follow up。基本思路仍然是用Map来查找元素,用array来新增元素。
3+ 此题是380的follow up。
44
5- 显然对于val->pos的映射应该构建 unordered_map<int,unordered_set< int >>val2pos, 以存储val对应的所有在数组中的(若干个)位置 。
5+ 设计数据结构的突破口就是在于getRandom的时间要求,o(1)必然说明我们需要维护一个数组nums,这样直接通过 ``` nums[rand()% nums.size()] ``` 就可以直接随机访问一个元素 。
66
7- 在Delete(val)过程中,腾出的位置要用``` val2 = array.back() ``` 来替换,相应地``` val2pos[val2] ``` 也要更新,即删除val2原来的位置(也就是nums的末尾),添加val的位置。
7+ 那么如何处理remove的操作呢?对于数组而言删除一个中间元素的代价很大。一个常见的想法就是,将最后一个元素挪到被删除的元素的位置上去。这样保证了数组依然是线性连续的。所以我们需要维护一个hash表来存储每个数值所出现的(所有)index。具体的操作包括:
8+ 1 . 从Map[ val] 中挑一个位置pos,将nums.back()移过来。
9+ 2 . 从Map[ val] 中删除pos
10+ 3 . 更新Map[ nums.back()] 的位置,将原先的nums.size()-1改为pos
11+ 4 . nums.pop_back()
12+ 5 . 注意,如果Map[ val] 已经为空,那么请将val这个key从hash表中删除。
813
9- 特别注意:如果val就是nums末尾的元素(即 ``` val==val2 ``` ) ,最好单独处理,否则容易出错。
14+ 特别注意:如果val就是nums末尾的元素,最好单独处理,否则容易出错。
1015
1116
1217[ Leetcode Link] ( https://leetcode.com/problems/insert-delete-getrandom-o1-duplicates-allowed )
You can’t perform that action at this time.
0 commit comments