建网站备案需要的材料外贸营销推广
建网站备案需要的材料,外贸营销推广,郑州的兼职网站建设,海口房地产网站建设爬梯子、跳跃游戏、最小路径和、杨辉三角、接雨水。每题做详细思路梳理#xff0c;配套PythonJava双语代码#xff0c; 2024.03.05 可通过leetcode所有测试用例。
目录
70. 爬楼梯
解题思路
完整代码
Python
Java
55. 跳跃游戏
解题思路
完整代码
Python
代码… 爬梯子、跳跃游戏、最小路径和、杨辉三角、接雨水。每题做详细思路梳理配套PythonJava双语代码 2024.03.05 可通过leetcode所有测试用例。
目录
70. 爬楼梯
解题思路
完整代码
Python
Java
55. 跳跃游戏
解题思路
完整代码
Python
代码优化
Java
64. 最小路径和
解题思路
完整代码
Python
Java
118. 杨辉三角
解题思路
完整代码
Python
Java
42. 接雨水
解题思路
完整代码
Python
Java 70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢 示例 1 输入n 2
输出2
解释有两种方法可以爬到楼顶。
1. 1 阶 1 阶
2. 2 阶 示例 2 输入n 3
输出3
解释有三种方法可以爬到楼顶。
1. 1 阶 1 阶 1 阶
2. 1 阶 2 阶
3. 2 阶 1 阶 解题思路
这个问题是一个经典的动态规划问题可以通过动态规划的方法来解决。思路如下
定义状态定义dp[i]表示到达第i阶楼梯有dp[i]种方法。状态转移方程到达第i阶楼梯可以从第i-1阶上来也可以从第i-2阶上来。因此dp[i] dp[i-1] dp[i-2]。初始化dp[0]1没有楼梯时我们认为有一种方法dp[1]1只有一阶楼梯时只有一种方法。计算顺序从第2阶楼梯开始计算直到第n阶。
完整代码
Python
class Solution:def climbStairs(self, n: int) - int:if n 1:return 1dp [0] * (n 1)dp[0], dp[1] 1, 1for i in range(2, n 1):dp[i] dp[i - 1] dp[i - 2]return dp[n]Java
public class Solution {public int climbStairs(int n) {if (n 1) {return 1;}int[] dp new int[n 1];dp[0] 1;dp[1] 1;for (int i 2; i n; i) {dp[i] dp[i - 1] dp[i - 2];}return dp[n];}
}55. 跳跃游戏 给你一个非负整数数组 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 所以永远不可能到达最后一个下标。提示 1 nums.length 1040 nums[i] 105 解题思路 要使用动态规划解决这个问题我们可以定义一个状态数组dp其中dp[i]表示能否到达数组中的第i个位置。动态规划的过程是从前向后逐步构建dp数组的值直到最后一个元素。
具体步骤如下
初始化创建长度为nums.length的布尔数组dp初始全部设为false。dp[0] true因为起始位置总是可达的。状态转移对于每一个位置ii从1开始到nums.length - 1遍历i之前的所有位置jj从0到i-1如果位置j是可达的即dp[j] true并且从位置j跳跃的最大长度nums[j]加上j的位置能够达到或超过i即j nums[j] i那么位置i也是可达的设置dp[i] true。返回值最后返回dp数组的最后一个值即dp[nums.length - 1]表示是否能够到达最后一个下标。
完整代码
Python
class Solution:def canJump(self, nums: List[int]) - bool:dp [False] * len(nums)dp[0] True # 起始位置总是可达的for i in range(1, len(nums)):for j in range(i):# 如果j是可达的并且从j可以跳到i或更远则将i标记为可达if dp[j] and j nums[j] i:dp[i] Truebreak # 找到一个可达的j就足够了无需继续查找return dp[-1] # 返回是否可以到达最后一个位置代码优化 这个动态规划解法可通过142个测试用例有的会因为时间过长失败可以通过优化来减少其时间复杂度。原始的解法中我们使用了嵌套循环导致时间复杂度为O(n^2)。优化的思路是利用贪心算法的原理来更新一个变量记录当前能够到达的最远距离这样可以避免内层的循环将时间复杂度降低到O(n)。
class Solution:def canJump(self, nums: List[int]) - bool:maxReach 0 # 初始化最远可到达位置for i, jump in enumerate(nums):if i maxReach: # 如果当前位置i超出了之前可达的最远距离maxReach则无法到达ireturn FalsemaxReach max(maxReach, i jump) # 更新可到达的最远位置if maxReach len(nums) - 1: # 如果maxReach已经到达或超过最后一个位置则可以到达return Truereturn False # 如果遍历结束还没有返回True则表示不能到达最后一个位置Java
public class Solution {public boolean canJump(int[] nums) {boolean[] dp new boolean[nums.length];dp[0] true; // 初始化起点为可达for (int i 1; i nums.length; i) {for (int j 0; j i; j) {// 如果j是可达的并且从j可以跳到i或更远则将i标记为可达if (dp[j] j nums[j] i) {dp[i] true;break; // 找到一个可达的j就足够了无需继续查找}}}return dp[nums.length - 1]; // 返回是否可以到达最后一个位置}
}64. 最小路径和 给定一个包含非负整数的 m x n 网格 grid 请找出一条从左上角到右下角的路径使得路径上的数字总和为最小。 说明每次只能向下或者向右移动一步。 示例 1 输入grid [[1,3,1],[1,5,1],[4,2,1]]
输出7
解释因为路径 1→3→1→1→1 的总和最小。示例 2 输入grid [[1,2,3],[4,5,6]]
输出12提示 m grid.lengthn grid[i].length1 m, n 2000 grid[i][j] 200 解题思路 对于“最小路径和”这个问题我们同样可以使用动态规划的方法来解决。这个问题的目标是找到从左上角到右下角的路径使得路径上的数字总和为最小。
解题思路如下
定义状态dp[i][j]表示从左上角到达点(i, j)的最小路径和。状态转移方程到达点(i, j)的路径可以从上方(i-1, j)或左方(i, j-1)来因此dp[i][j] grid[i][j] min(dp[i-1][j], dp[i][j-1])。需要特别注意边界条件即当i或j为0时只有一条路径可走。初始化dp[0][0] grid[0][0]即起点的最小路径和就是其自身的值。对于第一行和第一列的其他元素因为它们只能从一个方向来要么是上边要么是左边所以可以直接累加。计算顺序从左上角开始逐行或逐列填充dp数组直到右下角。返回值dp数组右下角的值即dp[m-1][n-1]代表了从左上角到右下角的最小路径和。
完整代码
Python
class Solution:def minPathSum(self, grid: List[List[int]]) - int:m, n len(grid), len(grid[0])dp [[0] * n for _ in range(m)]dp[0][0] grid[0][0]for i in range(1, m):dp[i][0] dp[i-1][0] grid[i][0]for j in range(1, n):dp[0][j] dp[0][j-1] grid[0][j]for i in range(1, m):for j in range(1, n):dp[i][j] grid[i][j] min(dp[i-1][j], dp[i][j-1])return dp[-1][-1]Java
public class Solution {public int minPathSum(int[][] grid) {int m grid.length, n grid[0].length;int[][] dp new int[m][n];dp[0][0] grid[0][0];for (int i 1; i m; i) {dp[i][0] dp[i-1][0] grid[i][0];}for (int j 1; j n; j) {dp[0][j] dp[0][j-1] grid[0][j];}for (int i 1; i m; i) {for (int j 1; j n; j) {dp[i][j] grid[i][j] Math.min(dp[i-1][j], dp[i][j-1]);}}return dp[m-1][n-1];}
}118. 杨辉三角 给定一个非负整数 numRows生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1
输出: [[1]]提示: 1 numRows 30 解题思路 生成杨辉三角的过程可以通过动态规划的方法来实现。每一行的数字是基于上一行的数字计算得来的具体规则是每一行的第一个和最后一个数字都是1对于其中的其他数字即第i行的第j个数字行列均从0开始计数可以通过上一行的第j-1个数字和第j个数字之和获得即triangle[i][j] triangle[i-1][j-1] triangle[i-1][j]。
解题思路如下
初始化初始化一个列表triangle来存储整个杨辉三角。外层循环从第0行遍历到第numRows-1行。 每一行初始化一个列表row首个元素设为1因为每行的开始都是1。内层循环从第1个元素遍历到当前行的倒数第二个元素因为每行的最后一个元素也是1已经确定。 根据triangle[i][j] triangle[i-1][j-1] triangle[i-1][j]的规则计算当前位置的元素并添加到当前行列表row中。行尾处理在每一行的最后添加1每行的结束都是1。将当前行添加到杨辉三角中将构建好的当前行row添加到triangle中。返回结果返回triangle。
完整代码
Python
class Solution:def generate(self, numRows: int) - List[List[int]]:triangle []for i in range(numRows):row [None for _ in range(i 1)] # 初始化当前行row[0], row[-1] 1, 1 # 每行的开始和结束都是1for j in range(1, len(row) - 1): # 计算中间的值row[j] triangle[i-1][j-1] triangle[i-1][j]triangle.append(row) # 将当前行添加到杨辉三角中return triangleJava
public class Solution {public ListListInteger generate(int numRows) {ListListInteger triangle new ArrayListListInteger();for (int i 0; i numRows; i) {ListInteger row new ArrayListInteger();for (int j 0; j i; j) {if (j 0 || j i) { // 每行的开始和结束都是1row.add(1);} else {row.add(triangle.get(i-1).get(j-1) triangle.get(i-1).get(j)); // 计算中间的值}}triangle.add(row); // 将当前行添加到杨辉三角中}return triangle;}
}42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图计算按此排列的柱子下雨之后能接多少雨水。 示例 1 输入height [0,1,0,2,1,0,1,3,2,1,2,1]
输出6
解释上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图在这种情况下可以接 6 个单位的雨水蓝色部分表示雨水。 示例 2 输入height [4,2,0,3,2,5]
输出9提示 n height.length1 n 2 * 10^40 height[i] 10^5 解题思路 接雨水问题可以通过动态规划来解决。核心思想是计算每个柱子上方能接多少雨水这取决于该柱子左右两侧最高柱子的高度。具体来说某个位置能接的雨水量等于该位置左侧最高柱子和右侧最高柱子中较矮的一个的高度减去当前柱子的高度。
动态规划的步骤如下
计算每个位置的左侧最大高度遍历一次高度数组height计算每个位置左侧的最大高度存储在数组leftMax中。计算每个位置的右侧最大高度再次遍历高度数组height但这次是从右向左遍历计算每个位置右侧的最大高度存储在数组rightMax中。计算每个位置上方能接的雨水量遍历每个位置使用min(leftMax[i], rightMax[i]) - height[i]来计算每个位置上方能接的雨水量。如果这个值是负数则说明在该位置不会积水因此将其视为0。求和将每个位置上方能接的雨水量相加得到总的接雨水量。
完整代码
Python
class Solution:def trap(self, height: List[int]) - int:if not height:return 0n len(height)leftMax [0] * nrightMax [0] * nwater 0leftMax[0] height[0]for i in range(1, n):leftMax[i] max(leftMax[i-1], height[i])rightMax[n-1] height[n-1]for i in range(n-2, -1, -1):rightMax[i] max(rightMax[i1], height[i])for i in range(n):water min(leftMax[i], rightMax[i]) - height[i]return waterJava
public class Solution {public int trap(int[] height) {if (height null || height.length 0) {return 0;}int n height.length;int[] leftMax new int[n];int[] rightMax new int[n];int water 0;leftMax[0] height[0];for (int i 1; i n; i) {leftMax[i] Math.max(leftMax[i-1], height[i]);}rightMax[n-1] height[n-1];for (int i n-2; i 0; i--) {rightMax[i] Math.max(rightMax[i1], height[i]);}for (int i 0; i n; i) {water Math.min(leftMax[i], rightMax[i]) - height[i];}return water;}
}------------------------------
总结不易。看到这了觉得有用的话点个赞吧。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/87588.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!