楼主: albusshin
跳转到指定楼层
上一主题 下一主题
收起左侧

CMU MSIT-SE 2015的青蛙题 FrogPond,求解

全局:
albusshin 发表于 2015-7-2 09:31
但是好像没有必要往后跳吧

也对啊,如果你已经能到更远的地方,那么往回跳肯定不如从当前位置直接往前跳。
回复

使用道具 举报

🔗
269644943 2015-10-9 08:09:02 | 只看该作者
全局:
本帖最后由 269644943 于 2015-10-9 08:29 编辑
stellari 发表于 2015-7-1 21:37
这题其实和Leetcode上的"Maximum Gap"很像。比如考虑X = 8, D = 3的情况,一开始pond是这样的:

1 0 0 0 ...

你好!你的方法很好, 是不是可以简化下

我们是不是可以把你所说的range 换成两个 数组, 一个存最大值,一个存最小值。 每次叶子落下的时候, 我们直接更新即可。 这样代码量少了很多。

欢迎指正!
回复

使用道具 举报

🔗
jy_121 2015-10-9 11:50:49 | 只看该作者
全局:
今天做LiveRamp就是这道题。。。我用的并查级,但是感觉不是O(n)啊
回复

使用道具 举报

🔗
jy_121 2015-10-9 11:58:08 | 只看该作者
全局:
georgmaster 发表于 2015-7-1 23:37
请问用union find可以吗?
public int solution(){
                for(int i = 0; i < N; i++){

如果再设置一个标志数组的话,是不是就不满足空间复杂度O(n)的要求了?
回复

使用道具 举报

🔗
Aaron_Zhao 2015-10-14 09:03:19 | 只看该作者
全局:
昨天和同学一起做LiveRamp的时候碰到这道题了。开始也想不到O(n)的做法,后来查了一下,发现就是先用一个array存每一个leaf落下的时间,然后就是leetcode的sliding window maximum原题。不过把maximum换成minimum,然后答案就是minimum的maximum。
回复

使用道具 举报

🔗
uuisafresh 2016-2-2 21:59:29 | 只看该作者
全局:
满城尽带黄金甲 发表于 2015-7-1 22:32
用你的例子好了, boolean[] bridge = new boolean[X];
第0秒,叶子降落在位置1, 那么bridge[0]~bridge ...

每一秒,都要将A[i]-D~A[i]+D置为true,这个时间复杂度应该是O(N*2D)吗?
回复

使用道具 举报

🔗
uuisafresh 2016-2-2 22:12:11 | 只看该作者
全局:
zhuli19901106 发表于 2015-7-1 22:41
等你的代码咯,咱们毕竟不是在辩论。

为什么贪心不行

P=青蛙能够到达的最远距离

初始化
P=D

循环
For i=1~N
  if A[i]<=P+D&&A[i]>P//青蛙能够到达A[i]且A[i]比青蛙现在的位置更远
    P=A[i]
  if P>=X
    return i
回复

使用道具 举报

🔗
qiuyu8290 2018-1-17 23:36:04 | 只看该作者
全局:
感谢@stellari 的思路,这是我写出来的类似的代码, 大家可以批评指正
  1. import java.util.Arrays;

  2. class Solution {
  3.   public int solution(int[] A, int N, int X, int D) {
  4.     if (X <= D) {
  5.       return 0;
  6.     }
  7.     int N_buck = (int)Math.ceil((double)X / D);
  8.     int[] minBuck = new int[N_buck];
  9.     int[] maxBuck = new int[N_buck];
  10.     // a bucket is connected if this bucket is not empty and if there is previous bucket, the previous bucket is already connected
  11.     boolean[] connected = new boolean[N_buck];
  12.     Arrays.fill(minBuck, Integer.MAX_VALUE);
  13.     Arrays.fill(maxBuck, Integer.MIN_VALUE);
  14.     minBuck[0] = 0;
  15.     maxBuck[0] = 0;
  16.     minBuck[N_buck - 1] = X;
  17.     maxBuck[N_buck - 1] = X;
  18.     int count = 1;
  19.     connected[0] = true;
  20.     int i= 0;
  21.     while (count != N_buck && i < N) {
  22.       int idx = A[i] / D;
  23.       minBuck[idx] = Math.min(minBuck[idx], A[i]);
  24.       maxBuck[idx] = Math.max(maxBuck[idx], A[i]);
  25.       // check before
  26.       if (!connected[idx] && idx - 1 >= 0) {
  27.         // if not empty
  28.         if (minBuck[idx - 1] != Integer.MAX_VALUE || maxBuck[idx - 1] != Integer.MIN_VALUE) {
  29.           if (minBuck[idx] - maxBuck[idx - 1] <= D) {
  30.             connected[idx] = true;
  31.             count++;
  32.           }
  33.         }
  34.       }
  35.       // check after
  36.       if (idx + 1 < N_buck && !connected[idx + 1]) {
  37.         // if not empty
  38.         if (minBuck[idx + 1] != Integer.MAX_VALUE || maxBuck[idx + 1] != Integer.MIN_VALUE) {
  39.           if (minBuck[idx + 1] - maxBuck[idx] <= D) {
  40.             connected[idx + 1] = true;
  41.             count++;
  42.           }
  43.         }
  44.       }
  45.       i++;
  46.     }
  47.     if (count == N_buck) {
  48.       return i - 1;
  49.     }
  50.     return -1;
  51.   }
  52. }
复制代码
回复

使用道具 举报

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

本版积分规则

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