avatar
问1道array hop的题# JobHunting - 待字闺中
j*n
1
没想明白,这个是DP还是什么?
Start with an array A of positive numbers. Start at index 0. From index i,
you can move to index i+x for any x <= A[i]. The goal is to find the minimum
number of moves needed to get to the end of the array.
更新,面试时候的题目说这个array 只是非负,会有0的情况,跳那就卡死了。
请指教....
avatar
p*2
2

minimum
伪greedy

【在 j*****n 的大作中提到】
: 没想明白,这个是DP还是什么?
: Start with an array A of positive numbers. Start at index 0. From index i,
: you can move to index i+x for any x <= A[i]. The goal is to find the minimum
: number of moves needed to get to the end of the array.
: 更新,面试时候的题目说这个array 只是非负,会有0的情况,跳那就卡死了。
: 请指教....

avatar
q*y
3
LeetCode Jump Game II. 从右向左,搞个array S[]记录每一位的最少步数。当前最少
等于min{S[i+1],...S[i+A[i]]}+1。最坏情况O(n^2)。虽然过了online judge。
求更好解法。
avatar
p*2
4

这题的正解是O(n)

【在 q***y 的大作中提到】
: LeetCode Jump Game II. 从右向左,搞个array S[]记录每一位的最少步数。当前最少
: 等于min{S[i+1],...S[i+A[i]]}+1。最坏情况O(n^2)。虽然过了online judge。
: 求更好解法。

avatar
q*y
5
所以求解啊
avatar
j*e
7
这个题的trick就是每一步只选i+A[i]最大的位置。
A[0]确定了第一步可以到位置0~A[0],然后从中选出i+A[i]最大的i。
第二步就可以到A[0]+1~i+A[i],然后从这些位置再选

【在 q***y 的大作中提到】
: LeetCode Jump Game II. 从右向左,搞个array S[]记录每一位的最少步数。当前最少
: 等于min{S[i+1],...S[i+A[i]]}+1。最坏情况O(n^2)。虽然过了online judge。
: 求更好解法。

avatar
z*i
8
注意到如果A[j]能到A[n-1],那么对任意iA[i]+i>=j,则A[i]=2。例子:输
入数组1 3 4 1 1 1 6。A[4]需要3步道A[6],A[3]需要4步,A[2]仅需要1步。考虑A[2]
的时候,A[1]+1=4〉2,那么A[1]仅需要两步则可到A[6]。更普遍的情况如下:
A[0] A[3] A[9] A[14] A[22] A[n-1]
5步 4步 3步 2步 1步
我们可假设在A[22]前没有任何元素可仅用1步就到A[n-1],A[14]前没有任何元素可仅
用2步就到A[n-1],等等。但是,在A[22]和A[14]间可有元素需2步(3步等等)才能到A
[n-1]。
现在,可以考虑保存从n-1倒溯的时候记录(最小的步数,下标)。在前面的例子中,
先记录(1,22)。当到溯还未到A[14]的时候,记录有(1,22),(2,19),(3,
16)。那么当到溯至A[14]的时候,发现A[14]仅用2步可到A[n-1],因为A[14]+14〉22
。所以保留(1,22)和(2,14)。
简单的分析,可见时间复杂度是O(nlongn)。感觉复杂度可能为O(n)。

minimum

【在 j*****n 的大作中提到】
: 没想明白,这个是DP还是什么?
: Start with an array A of positive numbers. Start at index 0. From index i,
: you can move to index i+x for any x <= A[i]. The goal is to find the minimum
: number of moves needed to get to the end of the array.
: 更新,面试时候的题目说这个array 只是非负,会有0的情况,跳那就卡死了。
: 请指教....

avatar
K*i
9
正解。
摆脱点跳到点这个思路限制,形成区间跳到区间的更高层概念,在每个区间内遍历寻找
下个区间的右边界是伪Greedy的选法,这样就能达到O(n)

【在 j********e 的大作中提到】
: 这个题的trick就是每一步只选i+A[i]最大的位置。
: A[0]确定了第一步可以到位置0~A[0],然后从中选出i+A[i]最大的i。
: 第二步就可以到A[0]+1~i+A[i],然后从这些位置再选

avatar
j*n
10
那如果这个array 不是 positive number, 是non-negative呢, 有可能会有0,能用同
同样的思路吗, 昨晚面试被问的就是non-negative的情况,想了半天也没想出来.
avatar
t*3
11
有0?就是说如果跳到那个位子,就卡死在那里了? 那岂不是要尽量避免?

【在 j*****n 的大作中提到】
: 那如果这个array 不是 positive number, 是non-negative呢, 有可能会有0,能用同
: 同样的思路吗, 昨晚面试被问的就是non-negative的情况,想了半天也没想出来.

avatar
j*n
12
对 ,就是跳那就卡死了,想了个伪greedy, 上来就测试 有 0 的情况, 一下就挂了。

【在 t********3 的大作中提到】
: 有0?就是说如果跳到那个位子,就卡死在那里了? 那岂不是要尽量避免?
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。