CS3334 Data Structures Midterm
A. A+B Problem
给定两个正整数 和 ,求 。
数据范围:
题解:高精度加法。
时间复杂度:
B. Stock Market
给定一个长度为 的数组 ,求这个数组绘制的直方图中最大的矩形面积。
数据范围:
样例输入:
1 | 7 |
样例输出:
1 | 12 |
样例说明:选择区间 ,矩形宽度为 3,高度为 4,面积为 12。
题解:单调栈。
创建一个栈储存直方图中的矩形,每个矩形用两个参数表示:
height
:矩形的高度,即该范围内的最小值width
:矩形的宽度,即该范围的长度
为了保证所有矩形合法,这是一个单调栈,即栈中的矩形 height
严格递增。
从左到右考虑直方图中的每一个元素:
- 如果 大于栈顶元素的
height
,则目前栈内的矩形均合法,并且新增一个更高的矩形height = a[i], width = 1
,将其入栈 - 如果 小于等于栈顶元素的
height
,则目前栈内height
大于等于 的矩形均变为非法。- 将他们出栈,计算出栈的矩形的有效面积,更新最大值
- 考虑一个例子:即将出栈
height1, width1
,height2, width2
两个矩形,根据单调栈有height1 > height2
,则矩形 1 的有效面积为height1 * width1
;将矩形 1 的高度压缩到height2
,则两个矩形一样高,可以合并为一个矩形,其面积为height2 * (width1 + width2)
,作为矩形 2 的有效面积。 - 因此,记录已经出栈的矩形总宽度
totalWidth
,则目前矩形的有效面积为height[i] * (totalWidth + width[i])
,更新最大值 - 最后,将这些出栈矩形的高度全部压缩至
a[i]
,则新增一个矩形height = a[i], width = totalWidth + 1
,将其入栈
最后,直方图中的元素已全部考虑完毕,但是栈中可能还有剩余的矩形,按上述第二种情况处理即可。
时间复杂度: - 每个元素最多被处理两次,一次入栈,一次出栈
对样例进行模拟:
栈 | 出栈元素 | totalWidth |
出栈矩形面积 | ||
---|---|---|---|---|---|
1 | 6 | (6, 1) | |||
2 | 2 | (6, 1) | 0 | 6*1=6 | |
2 | 2 | (2, 2) | 1 | ||
3 | 5 | (2, 2), (5, 1) | |||
4 | 4 | (2, 2) | (5, 1) | 0 | 5*1=5 |
4 | 4 | (2, 2), (4, 2) | 1 | ||
5 | 5 | (2, 2), (4, 2), (5, 1) | |||
6 | 1 | (2, 2), (4, 2) | (5, 1) | 0 | 5*1=5 |
6 | 1 | (2, 2) | (4, 2) | 1 | 4*(2+1)=12 |
6 | 1 | (2, 2) | 3 | 2*(2+3)=10 | |
6 | 1 | (1, 6) | 5 | ||
7 | 6 | (1, 6), (6, 1) | |||
- | - | (1, 6) | (6, 1) | 0 | 6*1=6 |
- | - | (1, 6) | 1 | 1*(6+1)=7 |
C. The Longest Increasing Subsequence
给定 个任务,每个任务于 时刻到达,需要 时间完成,优先级为 ( 为高优先级, 为低优先级)。
CPU 的处理模式为:将任务按照优先级分为两个队列,高优先级队列和低优先级队列,每次从高优先级队列中选择最早到达的任务执行,如果高优先级队列为空,则从低优先级队列中选择最早到达的任务执行。
求每个任务的完成时刻。
数据范围:
样例输入:
1 | 3 |
样例输出:
1 | 6 2 10 |
题解:模拟即可。
在每一时刻 :
- 将所有 的任务加入各自对应的队列
- 如果高优先级队列为空,且低优先级队列非空,弹出低优先级队列中最早到达的任务执行
- 如果高优先级队列非空,弹出高优先级队列中最早到达的任务执行
- 如果两者都为空,说明当前时刻没有任务到达,跳到下一个任务到达的时刻
时间复杂度: - 最坏情况下每次都要遍历所有任务
D. Mira - The Dragon Slayer
比 A 更简单的签到题。