男女做暖暖视频免费网站wordpress 首页地址

📝个人主页:五敷有你
🔥系列专栏:算法分析与设计
⛺️稳中求进,晒太阳

题目
给你一个非负整数数组
nums,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回
true;否则,返回false。
示例
示例 1:
输入:nums = [2,3,1,1,4] 输出:true 解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例 2:
输入:nums = [3,2,1,0,4] 输出:false 解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标
思路
贪心算法:
        使用贪心算法来维护能够到达的最远位置 (maxReach)。如果 maxReach 大于等于数组的最后一个位置,返回 true。否则,返回 false。
- 使用一个变量 
maxReach来表示当前能够到达的最远位置。 - 遍历数组,更新 
maxReach为当前位置能够到达的最远位置。 - 如果 
maxReach大于等于数组的最后一个位置,则可以到达最后一个下标,返回true;否则,返回false。 
指向2,最远到1

指向3,最远到4(其实到这就不用比较了)

指向1,最远到4

指向1,最远到4

动态规划
        使用动态规划来维护一个数组,记录到达每个位置是否可行。如果最终数组的最后一个元素为 true,则表示可以到达最后一个下标。
- 使用一个布尔数组 
dp,表示每个位置是否可达。 - 初始化 
dp[0]为true。 - 遍历数组,对于每个位置 
i,检查之前的位置j是否可达,并且能够跳到当前位置i。如果是,则将dp[i]设置为true。 - 返回 
dp[n - 1],其中n为数组长度。 
代码实现
贪心算法
public class Solution {public boolean canJump(int[] nums) {int n = nums.length;int rightmost = 0;for (int i = 0; i < n; ++i) {if (i <= rightmost) {rightmost = Math.max(rightmost, i + nums[i]);if (rightmost >= n - 1) {return true;}}}return false;}
}
 
动态规划
class Solution {public boolean canJump(int[] nums) {int n = nums.length;boolean[] canReach = new boolean[n];canReach[0] = true;for (int i = 1; i < n; i++) {for (int j = 0; j < i; j++) {if (canReach[j] && j + nums[j] >= i) {canReach[i] = true;break;}}}return canReach[n - 1];}
}
 
运行结果
贪心算法:时间复杂度O(n)

动态规划:时间复杂度O(n^2)

