2019-08-08

贪心算法-带贪心策略的证明过程

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

示例 1:

输入: [2,3,1,1,4]
输出: true
解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。
示例 2:

输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/jump-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

贪心策略

假设我们现在在索引 i 的位置。

1、如果索引 i 的值为 ,那么我们不可能再继续前进了;如果此时索引 i 就是最后一个位置,返回 true,否则,返回 false

2、如果索引 i 的值不为 ,那么我们下一步可以走到索引

而在 我们又可以走到索引

我们选取索引 的原则是使得 取得最大值。(这一步是贪心策略的体现)

贪心策略的证明

1、如果此时i + k + p的最大值仍然小于n - 1,说明经过此步还未能抵达数组中最后一个元素。
对于索引i而言,假设索引i下一步的最优解为索引i + k。索引i + k的下一步所能到达的范围是[i + k + 1, i + k + nums[i + k]]。
假设索引i + k不是索引i下一步的最优解,索引i下一步的最优解为索引i + j(j != k)。那么,索引i + j的下一步所能到达的范围是索引[i + j + 1, i + j + nums[i + j]]。
因为我们选取i + k的原则是使得i + k + p取得最大值,显然这里有i + j + nums[i + j] <= i + k + nums[i + k]。

a.如果j > k,那么i + j + 1 > i + k + 1,索引i + j的下一步所能到达的范围是小于索引i + k所能到达的范围的。即如果索引i + j能到的地方,索引i + k也能到,但是索引i + k能到的地方,索引i + j却不一定能到。因此索引i下一步的最优解一定只可能是i + k。

b.如果j < k,对于索引i + k + 1及其之后的索引位置,索引i + j的下一步所能到达的范围是小于索引i + k所能到达的范围的。即如果索引i + j能到的地方,索引i + k也能到,但是索引i + k能到的地方,索引i + j却不一定能到。而对于索引i + k + 1之前的索引位置,索引i + k是到不了的,索引i + j能到,但是此时其实多走了一步路。因为我们最终肯定是要跨过索引i + k,我们本可以一步到达索引i + k的位置,下一步就跨过索引i + k了,现在我们第一步到达索引i + j的位置,下一步还不能保证跨过索引i + k。因此索引i下一步的最优解一定只可能是i + k。

(2)如果此时i + k + p的最大值大于等于n - 1,说明经过此步能抵达数组中最后一个元素,显然索引i + k是最优解。

作者:617076674
链接:https://leetcode-cn.com/problems/two-sum/solution/tan-xin-suan-fa-dai-tan-xin-ce-lue-de-zheng-ming-g/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(2019-08-08)