Skip to content

Commit a4b1295

Browse files
authored
Update Readme.md
1 parent bd23018 commit a4b1295

File tree

1 file changed

+9
-4
lines changed
  • Design/381.Insert-Delete-GetRandom-O1-Duplicates-allowed

1 file changed

+9
-4
lines changed
Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
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)

0 commit comments

Comments
 (0)