由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - Gas station II
相关主题
问一道题请教一道面试题,判断迷宫有没有解
Amazon的题graph如何找最短路径?
Leetcode 上的jump game有人做出来了吗?search 一問 DFS
Amazon Interview Questionfloodfill为什么用DFS 而不是BFS? 求解 谢谢
问个算法题湾区2012-2013,个人面筋总结
问个google的面试题。Amazon 面经
请教一个题目问一个编程题
请教一道题问两道leetcode上的jump game 题
相关话题的讨论汇总
话题: int话题: jump话题: ii话题: game
进入JobHunting版参与讨论
1 (共1页)
s*****r
发帖数: 108
1
做了一道 leetcode 的 Gas station 正巧看书发现另一道 Gas Station,关心的是最
少加油次数,特此分享
题目是这样的,有 N 个加油站(给出坐标)直线排列,每个加油站最多加 B(i) 升油
。一开始车有 P 升油在原点,单位油走单位长度,需要行驶 L 长度。同样油箱也是无
限大的。问最少加油次数到达终点,或者不能走到。
s********u
发帖数: 1109
2
lz是Gas station问题迷,哈哈
m**********g
发帖数: 153
3
想不出来DP的方法。 DFS应该可以, two choices at each station, skip it or
pump gas. record the decisions and prune if next station/end point not
reachable
t******d
发帖数: 1383
4
跟那个jump game有联系么?可以联想下。
D**********d
发帖数: 849
5
这不是 Jump game 吗?
d*k
发帖数: 207
6
題目的意思應該是從原點(0)到最後一點(n-1),而不是像gas station要從任意點走
一圈。抛砖引玉说一个复杂度较高的DP。
f(i, p)表示位於i點,油量為p時候的解。令m = P + B(0) + B(1) + ... + B(n-1) 。
dist(i, j)表示i, j兩點間的距離。
顯然對於0 <= p <= m,有f(n-1, p) = 0
對於f(i, j), 0 <= i <= n -2, 0 <= j <= m,
若j >= dist(i, n - 1)則f(i, j) = 0
否則f(i, j) = 1 + min(f(k+1, j - dist(i, k+1) + B(k)), k需要滿足條件
(1) i <= k <= n - 2。
(2) j >= dist(i, k)
(3) j - dist(i, k) + B(k) >= dist(k, k+1)
(4) f(k + 1, j - dist(i, k+1 ) + B(k)) >= 0
若無滿足條件的k,則f(i,j) = -1
最後返回f(0, P)。时间复杂度n * n * m。
我想如果面试可以先这么回答看看面试官的反应,实际上搜素加剪枝应该效果更好。比
如,对于每个点,预先计算从它开始走到最后一个点至少需要多少油。如果搜索时到这
个点油量已经低于最低油量,则可以跳过当前方案。应该还有很smart的剪枝。
期待楼主公布答案啊。

【在 s*****r 的大作中提到】
: 做了一道 leetcode 的 Gas station 正巧看书发现另一道 Gas Station,关心的是最
: 少加油次数,特此分享
: 题目是这样的,有 N 个加油站(给出坐标)直线排列,每个加油站最多加 B(i) 升油
: 。一开始车有 P 升油在原点,单位油走单位长度,需要行驶 L 长度。同样油箱也是无
: 限大的。问最少加油次数到达终点,或者不能走到。

f******n
发帖数: 208
7
这道题是用优先队列解最简单。每次遇到一个station,你就赢得了B[i]的加油权利,把
这个权利放入优先队列。等你发现没油了,就从优先队列里找油最多的站来加,并将此
站取出优先队列。
这个题好像经常用在ACM入门题库里。
t**********r
发帖数: 2153
8
只要油箱大小不限,没有本质区别。

【在 s*****r 的大作中提到】
: 做了一道 leetcode 的 Gas station 正巧看书发现另一道 Gas Station,关心的是最
: 少加油次数,特此分享
: 题目是这样的,有 N 个加油站(给出坐标)直线排列,每个加油站最多加 B(i) 升油
: 。一开始车有 P 升油在原点,单位油走单位长度,需要行驶 L 长度。同样油箱也是无
: 限大的。问最少加油次数到达终点,或者不能走到。

n****e
发帖数: 678
9
这个想法好.

【在 f******n 的大作中提到】
: 这道题是用优先队列解最简单。每次遇到一个station,你就赢得了B[i]的加油权利,把
: 这个权利放入优先队列。等你发现没油了,就从优先队列里找油最多的站来加,并将此
: 站取出优先队列。
: 这个题好像经常用在ACM入门题库里。

s*****r
发帖数: 108
10
正解,此题和 jump game 还有 gas station 是完全不同的

【在 f******n 的大作中提到】
: 这道题是用优先队列解最简单。每次遇到一个station,你就赢得了B[i]的加油权利,把
: 这个权利放入优先队列。等你发现没油了,就从优先队列里找油最多的站来加,并将此
: 站取出优先队列。
: 这个题好像经常用在ACM入门题库里。

相关主题
问个google的面试题。请教一道面试题,判断迷宫有没有解
请教一个题目graph如何找最短路径?
请教一道题search 一問 DFS
进入JobHunting版参与讨论
b*******e
发帖数: 123
11
如果每次到一个加油站加油前必须把油箱倒空的话,那就是jump game。
不能用heap么?因为只要知道最值,相同的B_i不用保证顺序FILO
O(nlogn)
d***n
发帖数: 832
12
我怎么觉得跟Jump Game II是一样的,下面是jump game ii的code
// Jump Game II using Greedy Method
public static int JumpGame2(int[] array)
{
if (array == null) return 0;
int n = array.Length;
if (n == 0 || n == 1) return 0;
int maxJump = 0;
int maxPosition = 0;
int i = 0;
while(i {
maxPosition = Math.Max(maxPosition, array[i] + i);
if (maxPosition > 0) maxJump++;
if (maxPosition >= n - 1) return maxJump;
int savedI = i;
int subMaxPosition = 0;
for (int j = i + 1; j <= maxPosition; j++)
{
int temp = array[j] + j;
if (temp > subMaxPosition)
{
subMaxPosition = temp;
i = j;
}
}
if (savedI == i) return 0; // make progress in case there is
no path
}
return 0;
}

【在 s*****r 的大作中提到】
: 正解,此题和 jump game 还有 gas station 是完全不同的
b*******e
发帖数: 123
13

我第一开始也以为是,区别是你在每个index有可能有剩余。
例如
【2,1,0,0】
jump game II 不可能达到indiex 3, 这个能达到。

【在 d***n 的大作中提到】
: 我怎么觉得跟Jump Game II是一样的,下面是jump game ii的code
: // Jump Game II using Greedy Method
: public static int JumpGame2(int[] array)
: {
: if (array == null) return 0;
: int n = array.Length;
: if (n == 0 || n == 1) return 0;
: int maxJump = 0;
: int maxPosition = 0;
: int i = 0;

d***n
发帖数: 832
14
多谢。还真是,面试中要是碰到这个基本就挂了

【在 b*******e 的大作中提到】
:
: 我第一开始也以为是,区别是你在每个index有可能有剩余。
: 例如
: 【2,1,0,0】
: jump game II 不可能达到indiex 3, 这个能达到。

s*****r
发帖数: 108
15
做了一道 leetcode 的 Gas station 正巧看书发现另一道 Gas Station,关心的是最
少加油次数,特此分享
题目是这样的,有 N 个加油站(给出坐标)直线排列,每个加油站最多加 B(i) 升油
。一开始车有 P 升油在原点,单位油走单位长度,需要行驶 L 长度。同样油箱也是无
限大的。问最少加油次数到达终点,或者不能走到。
s********u
发帖数: 1109
16
lz是Gas station问题迷,哈哈
m**********g
发帖数: 153
17
想不出来DP的方法。 DFS应该可以, two choices at each station, skip it or
pump gas. record the decisions and prune if next station/end point not
reachable
t******d
发帖数: 1383
18
跟那个jump game有联系么?可以联想下。
D**********d
发帖数: 849
19
这不是 Jump game 吗?
d*k
发帖数: 207
20
題目的意思應該是從原點(0)到最後一點(n-1),而不是像gas station要從任意點走
一圈。抛砖引玉说一个复杂度较高的DP。
f(i, p)表示位於i點,油量為p時候的解。令m = P + B(0) + B(1) + ... + B(n-1) 。
dist(i, j)表示i, j兩點間的距離。
顯然對於0 <= p <= m,有f(n-1, p) = 0
對於f(i, j), 0 <= i <= n -2, 0 <= j <= m,
若j >= dist(i, n - 1)則f(i, j) = 0
否則f(i, j) = -1, 若dist(i, i+1) > B(i) + j
= 1 + f(i+1, j + B(i) - dist(i, i + 1), 若 j < dist(i, i + 1)
<= j + B(i)
= min(1 + f(i+1, j + B(i) - dist(i, i + 1), f(i+1, j)), 若
dist(i, i+1) <= j
最後返回f(0, P)。时间复杂度n * m。
我想如果面试可以先这么回答看看面试官的反应,实际上搜素加剪枝应该效果更好。比
如,对于每个点,预先计算从它开始走到最后一个点至少需要多少油。如果搜索时到这
个点油量已经低于最低油量,则可以跳过当前方案。应该还有很smart的剪枝。
期待楼主公布答案啊。

【在 s*****r 的大作中提到】
: 做了一道 leetcode 的 Gas station 正巧看书发现另一道 Gas Station,关心的是最
: 少加油次数,特此分享
: 题目是这样的,有 N 个加油站(给出坐标)直线排列,每个加油站最多加 B(i) 升油
: 。一开始车有 P 升油在原点,单位油走单位长度,需要行驶 L 长度。同样油箱也是无
: 限大的。问最少加油次数到达终点,或者不能走到。

相关主题
floodfill为什么用DFS 而不是BFS? 求解 谢谢问一个编程题
湾区2012-2013,个人面筋总结问两道leetcode上的jump game 题
Amazon 面经问个leetcode上的题目jump gameII,最优解是dijkstra最短路径
进入JobHunting版参与讨论
f******n
发帖数: 208
21
这道题是用优先队列解最简单。每次遇到一个station,你就赢得了B[i]的加油权利,把
这个权利放入优先队列。等你发现没油了,就从优先队列里找油最多的站来加,并将此
站取出优先队列。
这个题好像经常用在ACM入门题库里。
t**********r
发帖数: 2153
22
只要油箱大小不限,没有本质区别。

【在 s*****r 的大作中提到】
: 做了一道 leetcode 的 Gas station 正巧看书发现另一道 Gas Station,关心的是最
: 少加油次数,特此分享
: 题目是这样的,有 N 个加油站(给出坐标)直线排列,每个加油站最多加 B(i) 升油
: 。一开始车有 P 升油在原点,单位油走单位长度,需要行驶 L 长度。同样油箱也是无
: 限大的。问最少加油次数到达终点,或者不能走到。

n****e
发帖数: 678
23
这个想法好.

【在 f******n 的大作中提到】
: 这道题是用优先队列解最简单。每次遇到一个station,你就赢得了B[i]的加油权利,把
: 这个权利放入优先队列。等你发现没油了,就从优先队列里找油最多的站来加,并将此
: 站取出优先队列。
: 这个题好像经常用在ACM入门题库里。

s*****r
发帖数: 108
24
正解,此题和 jump game 还有 gas station 是完全不同的

【在 f******n 的大作中提到】
: 这道题是用优先队列解最简单。每次遇到一个station,你就赢得了B[i]的加油权利,把
: 这个权利放入优先队列。等你发现没油了,就从优先队列里找油最多的站来加,并将此
: 站取出优先队列。
: 这个题好像经常用在ACM入门题库里。

b*******e
发帖数: 123
25
如果每次到一个加油站加油前必须把油箱倒空的话,那就是jump game。
不能用heap么?因为只要知道最值,相同的B_i不用保证顺序FILO
O(nlogn)
d***n
发帖数: 832
26
我怎么觉得跟Jump Game II是一样的,下面是jump game ii的code
// Jump Game II using Greedy Method
public static int JumpGame2(int[] array)
{
if (array == null) return 0;
int n = array.Length;
if (n == 0 || n == 1) return 0;
int maxJump = 0;
int maxPosition = 0;
int i = 0;
while(i {
maxPosition = Math.Max(maxPosition, array[i] + i);
if (maxPosition > 0) maxJump++;
if (maxPosition >= n - 1) return maxJump;
int savedI = i;
int subMaxPosition = 0;
for (int j = i + 1; j <= maxPosition; j++)
{
int temp = array[j] + j;
if (temp > subMaxPosition)
{
subMaxPosition = temp;
i = j;
}
}
if (savedI == i) return 0; // make progress in case there is
no path
}
return 0;
}

【在 s*****r 的大作中提到】
: 正解,此题和 jump game 还有 gas station 是完全不同的
b*******e
发帖数: 123
27

我第一开始也以为是,区别是你在每个index有可能有剩余。
例如
【2,1,0,0】
jump game II 不可能达到indiex 3, 这个能达到。

【在 d***n 的大作中提到】
: 我怎么觉得跟Jump Game II是一样的,下面是jump game ii的code
: // Jump Game II using Greedy Method
: public static int JumpGame2(int[] array)
: {
: if (array == null) return 0;
: int n = array.Length;
: if (n == 0 || n == 1) return 0;
: int maxJump = 0;
: int maxPosition = 0;
: int i = 0;

d***n
发帖数: 832
28
多谢。还真是,面试中要是碰到这个基本就挂了

【在 b*******e 的大作中提到】
:
: 我第一开始也以为是,区别是你在每个index有可能有剩余。
: 例如
: 【2,1,0,0】
: jump game II 不可能达到indiex 3, 这个能达到。

n*****f
发帖数: 17
29
维护一个大顶堆,每遇到一个station,先判断现在油量是否为负。为负就不停从取堆
顶元素加上直到变正。然后把这个station的油量加到堆里。O(nlogn)
1 (共1页)
进入JobHunting版参与讨论
相关主题
问两道leetcode上的jump game 题问个算法题
问个leetcode上的题目jump gameII,最优解是dijkstra最短路径问个google的面试题。
一道变形的Jump题请教一个题目
amazon question请教一道题
问一道题请教一道面试题,判断迷宫有没有解
Amazon的题graph如何找最短路径?
Leetcode 上的jump game有人做出来了吗?search 一問 DFS
Amazon Interview Questionfloodfill为什么用DFS 而不是BFS? 求解 谢谢
相关话题的讨论汇总
话题: int话题: jump话题: ii话题: game