62. 不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径?
输入:m = 3, n = 2 输出:3
注意点🎃
- 注意数组下标,最后的结果在f[m - 1][n - 1]上
- 走过的位置只能由它的上一列或者是上一行走到(向下或者向右)
class Solution{
public int uniquePaths1(int m, int n) {
int[][] dp = new int[m][n];
//1、初始化数组
for (int i = 0; i < m; i++) {
dp[i][0] = 1;
}
for (int i = 0; i < n; i++) {
dp[0][i] = 1;
}
//2、一步一步举例、推出下一步位置和上一步的位置关系满足f[i][j] = f[i - 1][j] + f[i][j - 1]
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[m - 1][n - 1];
}
}
55. 跳跃游戏
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。
输入:nums = [2,3,1,1,4] 输出:true
注意点🎃
- 跳跃点的位置一定小于等于最远能跳的位置
- 数组中的每个元素代表你在该位置可以跳跃的最大长度(注意不是数组下标)
class Solution{
public static boolean canJump(int[] nums) {
//1、初始化
int maxPos = 0;
//2、遍历,由题意可推出(跳跃点的位置一定小于等于最远能跳的位置)即 ->i<=maxPos->true,i>maxPos->false
for (int i = 0; i < nums.length; i++) {
if (i > maxPos) {
return false;
}
maxPos = Math.max(maxPos, i + nums[i]);
}
return true;
}
}
42. 接雨水
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6
注意点🎃
- 以列的角度分析, 中间列的高度不能大于其两边的高度
class Solution{
public int trap(int[] height) {
int ans = 0;
int size = height.length;
//3个循环,第一个循环找到最高的柱子,第二个循环从左到右找到其左边最高的柱子,第三个循环从右到左到其右边最高的柱子
for (int i = 1; i < size - 1; i++) {
int max_left = 0, max_right = 0;
for (int j = i; j >= 0; j--) {
max_left = Math.max(max_left, height[j]);
}
for (int j = i; j < size; j++) {
max_right = Math.max(max_right, height[j]);
}
//找到左右两边最高的柱子,取其中较小的,减去当前柱子的高度,就是当前柱子能存的水
ans += Math.min(max_left, max_right) - height[i];
}
return ans;
}
}