Redian新闻
>
LiveRamp笔试题求解——frog jump
avatar
LiveRamp笔试题求解——frog jump# JobHunting - 待字闺中
i*r
1
青蛙初始位置0,对岸坐标X,青蛙最远可跳距离为D,给出长度N的数组A[K],下标表示
时刻,值表示该时刻落叶的坐标。青蛙可以用落叶做跳板。返回青蛙最早到达对岸的时
刻。不能到达返回-1.
例如 D=3, X=5, A=[1,2,3], 返回1.
要求时间O(N),空间O(X)
我的做法是设一个长X的bool数组记录[0,X]每个位置有否有叶子。每个时刻看新落叶是
否在前面,能否跳上,不能跳上就记录,能跳上就更新青蛙位置p,然后从p+D倒搜有否
叶子,更新p直至无法前进。每次更新位置判断是否能跳到目的地。
我感觉我的做法最坏情况是O(ND)而不是O(N),求更好的思路。
avatar
j*7
2
// time O(N). space O(X)
public int solution(int[] A, int X, int D) {
LinkedList deque = new LinkedList();
int[] pos = new int[X + 1];
pos[0] = 0;
pos[X] = 0;
for (int i = 1; i < X; i++) {
pos[i] = -1;
}
for (int i = 0; i < A.length; i++) {
if (pos[A[i]] == -1) {
pos[A[i]] = i;
}
}
int[] DP = new int[X + 1];
DP[0] = 0;
deque.add(0);
for (int i = 1; i <= X; i++) {
while (deque.isEmpty() == false && deque.getFirst() + D < i) {
deque.removeFirst();
}
if (pos[i] == -1 || deque.isEmpty()) {
DP[i] = -1;
continue;
}
DP[i] = Math.max(pos[i], DP[deque.getFirst()]);
while (deque.isEmpty() == false && DP[deque.getLast()] >= DP[i])
{
deque.removeLast();
}
deque.addLast(i);
}
return DP[X];
}
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。