题目要求我们输出栈中从小到大中间的数,考虑到有重复元素和排序,所以选择multiset,但是我们不能直接使用下标访问set元素,比如*(s.begin() + 2) 或 s[2],都是不行的。直接遍历的话会超时,所以我们可以用以下思路:
- 我们可以动态化地更新mid的值,比如3的时候mid = 3,2 3 的时候mid = 2,1 2 3的时候mid值是2,1 1 2 3 的时候mid = 1。
- 我们可以用两个multiset来存放值,s1用来存放 <= mid的值,s2用来存放 > mid的值。1 2 3 的时候s1里放1 2,s2里放3,mid的值是s1的最后一个元素2,1 1 2 3 的时候s1里放1 1,s2里放2 3,mid的值是1。
- 由于插入和删除的时候mid的值会有所变化,我们可以通过更新s1和s2里存放的值来更新mid,我们要使得s1.size() == s2.size() (这是偶数情况),或s1.size() == s2.size() + 1(这是奇数情况)。
1 | #include<bits/stdc++.h> |
反思:由于是一个一个元素插入或删除,所以mid的值只会移动一步,所以找到这个位置是关键,如果只用一个multiset的话,这个位置是找不到的。
