leetcode 45 跳跃游戏II 详细题解+证明 0(n)方法

题意

给定一个数组(长度n),然后每个数组1个integer(1-k),每个数字表示可以往后走1-a[i]步,求最少多少步走到.输出一个整数表示多少布.

动态规划(0(n*k))

第一个方法就是使用动态规划的方法来做,但是复杂度很大,而且是最简单的动态规划问题,因此这里不讨论.

贪心(0(n))

考虑如何贪心,假如当前处于第i个位置, a i a_i ai是表示跳跃数,有 p , q ∈ [ i + 1 , i + a i ] p , q \in [i+1 , i+a_i] p,q[i+1,i+ai],表示有 p p p q q q两个可以跳到的位置.
假如 p + a p < q + a q p+a_p < q + a_q p+ap<q+aq则p可以一步跳到的位置,q一定可以一步跳到.例如i -> p -> new ; 则由于new < q + a q q + a_q q+aq , 所以一定有i -> q -> new,所以q一定优于p .

所以可以使用其他的一些优化方法,例如堆可以到达0(n*lgn) , 单调栈可以 0(n).

但是其实还有一个优化可以让我们不使用单调栈:
那就是假如q是最优,那么 m a x j = i + 1 j ≤ i + a i j + a j = m a x j = 1 j ≤ i + a i j + a j max_{j=i+1}^{j\le i+a_i} j+a_j= max_{j=1}^{j\le i+a_i} j+a_j maxj=i+1ji+aij+aj=maxj=1ji+aij+aj
因为加入不是,那么有一个 g 使得 g + a g > q + a q 且 g < i g + a_g > q + a_q且g<i g+ag>q+aqg<i , 则到达q的路径一定存在一个1 -> … -> m -> … -> q使得 g 属 于 [ m + 1 , m + a i ] g 属于 [m+1 , m+a_i] g[m+1,m+ai],因此这个时候,选择的一定会选择g而不是p.所以得出结论.因此可以直接记录最大的j,则可以用0(n)做出来了.

你可能感兴趣的:(各种DP,各种脑洞)