贪婪法,精神在於有限的条件下,每一步都采取对於当下最有利的选择(短视近利),使状态更接近答案。
举现实的例子,股票涨就买、跌就卖的散户心态,可以称作贪婪法。
Given an array of non-negative integers, you are initially positioned at the first index of the array.
Each element in the array represents your maximum jump length at that position.
Determine if you are able to reach the last index.
Example 1:
Input: nums = [2,3,1,1,4]
Output: true
Explanation: Jump 1 step from index 0 to 1, then 3 steps to the last index.
Example 2:
Input: nums = [3,2,1,0,4]
Output: false
Explanation: You will always arrive at index 3 no matter what. Its maximum jump length is 0, which makes it impossible to reach the last index.
Constraints:
1 <= nums.length <= 3 * 10^4
0 <= nums[i][j] <= 10^5
有趣的地方在於,阵列从 0 开始计算,刚好可以看作是 起点。再来,阵列的 index 可以当作是到达该格需要的步数,而每一格的 index 与 可跳的数量,刚好可以看作是当下的最大步数。
整理上述内容,拿 Example 1 与 2 制作出列表:
Example 1
index: |0|1|2|3|4|
item: |2|3|1|1|4|
maxJump: |2|4|3|4|8|
Jump>Index? |T|T|T|T|T|
每格都是 T,有能力跳到最後一格
Example 2
index: |0|1|2|3|4|
item: |3|2|1|0|4|
maxJump: |3|3|3|3|8|
Jump>Index? |T|T|T|F|T|
出现 F,没有能力跳到最後一格
JS
/**
* @param {number[]} nums
* @return {boolean}
*/
const canJump = (nums) => {
const n = nums.length;
if (n === 0) {
return false;
} else if (n === 1) {
return true;
}
let maxJump = 0;
for (let i = 0; i < n; i++) {
if (i > maxJump) {
return false;
}
maxJump = Math.max(maxJump, i + nums[i]);
}
return true;
};
Java
class Solution {
public boolean canJump(int[] nums) {
int n = nums.length;
if (n == 0) {
return false;
} else if (n == 1) {
return true;
}
int maxJump = 0;
for (int i = 0; i < n; i++) {
if (i > maxJump) {
return false;
}
maxJump = Math.max(maxJump, i + nums[i]);
}
return true;
}
}
C
int max(int x, int y)
{
if (x > y)
{
return x;
}
return y;
}
bool canJump(int *nums, int numsSize)
{
if (numsSize == 0)
{
return false;
}
else if (numsSize == 1)
{
return true;
}
int maxJump = 0;
for (int i = 0; i < numsSize; i++)
{
if (i > maxJump)
{
return false;
}
maxJump = max(maxJump, i + nums[i]);
}
return true;
}
这题给我的感觉是小试身手,只要不断比较是否大於 maxJump
即可达到答案。
其实想想,贪婪法反应真实世界的情况,不少决策遵循短期可有效果的做法,不管後果如何,强势地做下去就对了。
一想到不管後果就觉得可怕,如果放任不管,硬体资源会被用掉多少?似乎又回到本系列文最初的问题,时间与空间的取舍。套用当时的看法,永远是情况调整,没有最佳解,只有最适解。
>>: 【验证模型】3-7 「今晚,我想来点⋯⋯」动手做的餐点选择器进化!(中集)
这边是我在上次面试时有被问到跟自己想搞清楚的几个问题 第一个问题就是什麽是MVVM? 如果VIEW上...
What is Flow? Flow 是用来处理非同步的资料流的一种方式,它会按照发射 (emit)...
使用 MySQLi MySQLi 全称 MySQL Improved extension, 算是 M...
Q1. 什麽是命令执行 指令是与电脑互动的一种方式,一般来说作业系统会包含至少一个 Shell 程序...
我: 客户要的网站我已经开发好,可以架上去了。 同事: 好,谢谢。 (过几天後...) 同事: 客...