12
返回列表 发新帖
楼主: 匿名
跳转到指定楼层
上一主题 下一主题
收起左侧

骨骼新鲜店面

🔗
justinyz 2020-8-21 11:53:04 | 只看该作者
全局:
完全没找到投递链接啊
回复

使用道具 举报

🔗
sjzy 2020-8-21 15:33:12 来自APP | 只看该作者
全局:
请问🐶家2021 new grad开了?能发一下链接么?完全没找到 谢谢
回复

使用道具 举报

🔗
ninjax 2020-8-24 21:22:24 | 只看该作者
全局:
泡利不相容 发表于 2020-8-21 04:55
感觉就是模拟啊,最直观的思路开个长度为w的array纪录每个点的高度,落下新矩阵的时候扫一遍看哪里放最矮

感觉是这个思路
回复

使用道具 举报

🔗
mylarryshell 2020-8-25 10:20:51 | 只看该作者
本楼:
全局:
二分查找。
回复

使用道具 举报

🔗
橡皮擦 2020-8-25 15:01:37 | 只看该作者
全局:
感觉可以用treemap来解决
1 先把[1, 0] -> [w, 0] 存在treemap里,然后按照每个点最低的排序
2 然后每个方块来的时候,loop 这个treemap,然后找到连续的可以放下这个方块的最低点,然后放入方块更新treepmap
3然后找出treemap最大的点?
回复

使用道具 举报

🔗
yourdoraemon 2020-8-25 15:47:52 | 只看该作者
全局:
感觉我们需要 记录三个值, <height, start index, length>

放进一个pq, 每次从最小height, 最小start index 开始, 找到 length 满足条件的, split 这个状态, (但是之前找出来的, 不满足条件的, 还得放回pq里面去🤣)

<height+矩形高度, startindex, 矩形宽度> 和 <height, startindex+矩形宽度, length-矩形宽度> 然后再放回pq里面, 在这个过程中maintain最大高度

这个复杂度是 nlog(n) ?

这么弄, 感觉就是用了pq优化了brute force 解, 不用每次花O(n)去找该在哪插入, 以及更新range.

不知道这样对不对, 坐等大佬给出 segment tree 之类的解法.




补充内容 (2020-8-26 00:55):
pls ignore, i am too naive

得用个别的数据结构, 这个还会影响 下一个 range.....
回复

使用道具 举报

🔗
qmonster 2020-8-27 11:08:46 | 只看该作者
全局:
谢谢楼主分享
请问放置每个矩形的时候要考虑旋转吗?比如转九十度就是width, height互换
回复

使用道具 举报

🔗
foryousee 2020-9-12 01:01:59 | 只看该作者
全局:
本帖最后由 foryousee 于 2020-9-12 01:05 编辑

我觉得这道题的难点在于corner case。首先要clarify几种情况,比如说,矩形是直接落下还是可以中途变道。如果可以变道,比如说你某些地方会分层,玩过俄罗斯方块的都知道我什么意思吧,贴着空隙进去,然后再往里面硬塞,这样的话每一个W点对于不同大小的方块其实可能是不同的高度,空隙够你进去,你就可以认为取较小的高度,进不去就要用顶上的高度。mock倒是可以mock,复杂度就会很高了。暂时想不出来特别优的解法。另外,找出最低点没办法用pq,因为最低点不一定放的进去,比如一个凹口。所以实际上是一个连续的array,找到一个矩阵长度的连续array,最大值最小。这就是另外一个hard难度的题了,sliding window找到所有的最大/最小值。时间复杂度是O(n)。这道题就是O(W), 下面附上代码。算了一下从看题到先用pq尝试失败,再到sliding window,再到写出代码差不多是20分钟,不过这个不需要沟通,现实面试通常也就40分钟不到,大概率我也没办法写出来,还有紧张的因素,以及你不太方便尝试将不说话闷头做测试。哎,看不到面经大概率也是挂。

  1. public class Solution {
  2.     public int findHighestPoint (int[][] rectangles, int W) {
  3.         int[] base = new int[W];
  4.         for (int[] rectangle : rectangles) {
  5.             int index = findIndex(W, rectangle[0]);
  6.             for (int i = index; i < rectangle[0] + index; i++) {
  7.                 W[i] += rectangle[1];
  8.            }
  9.         }
  10.         int max = 0;
  11.         for (int value : W) {
  12.             max = Math.max(max, value);
  13.        }
  14.        return max;
  15.     }

  16. private int findIndex (int[] W, int k) {
  17.     int height = Integer.MAX_VALUE, index = 0;
  18.    Deque<Integer> deque = new ArrayDeque<>();
  19.    for (int i = 0; i < W.length; i++) {
  20.        if (i >= k) {
  21.            if (deque.peekFirst() == (i - k)) {
  22.                deque.pollFirst();
  23.           }
  24.       }
  25.      while (!deque.isEmpty() && W[deque.peekLast()] < W[i]) {
  26.            deque.pollLast();
  27.       }
  28.      while (!deque.isEmpty() && W[deque.peekFirst()] < W[i]) {
  29.            deque.pollFirst();
  30.      }
  31.     deque.offerLast(i);
  32.     if (i - 1 >= k) {
  33.           if (W[deque.peekFirst() < height) {
  34.                 index = i - 1 - k;
  35.                 height = W[deque.peekFirst()];
  36.          }
  37.       }
  38.    }
  39.     return index;
  40.    }
  41. }
复制代码



[/i][/i][/i]
回复

使用道具 举报

🔗
ZionHuang 2020-9-19 07:03:54 | 只看该作者
全局:
本帖最后由 ZionHuang 于 2020-9-19 07:50 编辑

这题思路可以参考下 利口 依儿肆零  

需要用暴力dfs() 屏幕的宽度w 不能太大  因为每层dfs()都要深度复制一遍屏幕

暴力遍历 每次方块落下试着从最左边开始放方块 把横着落下还是竖着插入都dfs()一遍 每次都计算下结果
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表