【精选】JAVA算法题(十六)

这篇博客介绍了三道JAVA算法题:1.脏矩形合并,通过位运算优化判断相交的效率;2.反转链表,包括栈、双指针和递归三种解法;3.博弈问题,分析两人博弈策略以确定获胜者。通过这些题目,深入理解JAVA算法应用和博弈论思想。
摘要由CSDN通过智能技术生成

1.脏矩形合并

题目:

 在2D渲染系统中,局部渲染是常见提升渲染性能的方法。如果界面中有元素发生了改变,我们可以将这个元素所占矩形区域标记为脏矩形,那么在接下来的渲染中,我们仅对每个脏矩形所占矩形区域执行一次局部渲染即可,无需渲染全屏。
 但系统提供的局部渲染API有如下限制:
 1. 单次局部渲染区域必需是矩形,不能是多边形,圆形或者其他不规则形状。
 2. 单次局部渲染时间开销除了和渲染像素数量呈线性正相关之外,还有一些固定的额外开销。
 3. 单个元素不可切分渲染,既最初标记的脏矩形不可切分渲染。
 因此为了总渲染时间开销最优,我们一般不直接对每个标记的脏矩形都执行一次局部渲染,而是先对重叠或者相近的脏矩形进行合并,从而减少局部渲染次数。
 经过测试,在某台设备上,单次局部渲染时间开销与渲染像素数量(既渲染面积)的关系为f(x)=10000+x。
 现在要求你设计一个算法,算法输入一组脏矩形列表,输出经过合并后的脏矩形列表的总渲染时间开销,要求合并后的脏矩形列表总渲染时间开销在这台设备上最优。
 输入:
 输入数据包含多行
 第1行,整数N(脏矩形数量,1<=N<=8)
 第2行,整数L1(第一个脏矩形左上角横坐标)
 第3行,整数T1(第一个脏矩形左上角纵坐标)
 第4行,整数W1(第一个脏矩形宽, 1<=W1)
 第5行,整数H1(第一个脏矩形高, 1<=H1)
 ...
 第4*(N-1)+2行,整数LN(第N个脏矩形左上角横坐标)
 第4*(N-1)+3行,整数TN(第N个脏矩形左上角纵坐标)
 第4*(N-1)+4行,整数WN(第N个脏矩形宽, 1<=WN)
 第4*(N-1)+5行,整数HN(第N个脏矩形高, 1<=HN)
 输出:
 输出合并后的脏矩形列表总渲染时间开销
 输入范例:
 5
 232
 66
 111
 41
 197
 44
 29
 53
 154
 208
 42
 12
 177
 87
 9
 102
 75
 168
 79
 41
 输出范例:
 45291

这是我前两天参加阿里春招笔试的第一道编程题,可能读起来确实有些让人费解,大体的意思就是给你若干个矩形的坐标,你要渲染这些矩形,每执行一次渲染会消耗(10000+矩形面积)的时间,你可以渲染一大块矩形把其中多个矩形一起渲染,你要尽可能使时间最小。如果你还看不懂就看下面这个图:

黑色的矩形代表脏矩形 红色的矩形代表渲染的矩形 因为左边矩形的重合较多 所以可以一起渲染使得花费时间更少 右边的矩形因为离左边过远所以不适合一起渲染

这个问题需要考虑两种情况:

  1. 两个矩形相交 考虑合并 合并花费大于非合并--》不合并 否则合并
  2. 两个矩形距离较近 考虑合并 合并花费大于非合并--》不合并 否则合并

那么整个解题的流程就出来了

处理输入--》矩形数组
遍历矩形{
    如果相交且合并消耗小于等于非合并{
        合并矩形
    }
}
遍历矩形{
    如何两者合并消耗小于非合并{
        合并矩
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幽蓝丶流月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值