LeetCode 热题100 -62、55、42

142 阅读2分钟

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. 接雨水

image.png

输入: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;
    }
    }