239.
数据结构设计:用deque,为了保证单调序列,从后面push,直到比最后一个小。k框向右移动后最左边的值消失,所以也要设计pop。如果front和消失的值一样就pop,不一样不用管,因为原序列中最大的才会在front,如果消失的是小一点的值,已经在大值被放到deque里的时候去掉了。
用一个res每次i++记录新的front()
滑动的方法:先加入k个元素进入range,然后i从k遍历到结尾。
347.
pq排序的过程的时间复杂度是O(log k) 每次插入都是往size为k的heap里插入一个值,整个算法的时间复杂度是O(nlog k)
从一个无序的序列调整成最大堆(最小堆)的形式,时间复杂度为O(n)
每次插入或删除是log(n)
front()是log(1)
前k个的问题都可以用heap。排序问题且可以增删,可以限制size的,用heap
class, struct, constructor, and initializer list
custom comparator, custom operator, and functor
static bool comparator function is a comparator, so is a class with operator() overload in it(remember to specify public, because In C++ the default access level for class members is private).
🪐 For sort:
each way are acceptable, you can directly pass in a function but need to instantiate the class as shown below to use it. sort needs a value to be passed in it. whether it is a function pointer or an object of a class.
(The function name is automatically converted to a function pointer, which is used internally by std::sort()
to perform the comparison.)
(1005, function)
(406, function)
(406, class)
🪐 For priority_queue:
declare type的时候尖括号里面的也需要是type。class也是一种type。所以直接pass in type的名字
376(pq)
从map到pq的这部分,注意iterator的写法。还有mp的iterator dereference之后就是一个pair
总结:
- 陷阱1:栈是容器适配器,底层容器使用不同的容器,导致栈内数据在内存中是不是连续分布。
- 陷阱2:缺省情况下,默认底层容器是deque,那么deque的在内存中的数据分布是什么样的呢? 答案是:不连续的,下文也会提到deque。