题目 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处: 0 <= j <= nums[i]  i + j < n 返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。   示例 1: 输入: nums = [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2。   从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。 示例 2: 输入: nums = [2,3,0,1,4] 输出: 2 思路 每次跳跃的时候,都跳到最远的位置,一直跳到最后位置。这样的跳跃次数肯定是最少的。 代码 class Solution { public: int jump(vector<int>& nums) { //end每次跳的最远位置,初始值为0.

题目 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。   示例 1: 输入:nums = [2,3,1,1,4] 输出:true 解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。 示例 2: 输入:nums = [3,2,1,0,4] 输出:false 解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。 思路 遍历数组,看每一位跳的最远的地方在哪里。如果数组里不含有0,则肯定能够到达最后一个下标。当数组中间某个位置是0,并且从开始往后跳,最远只能到达这个0位置,则是不能到达最后一个下标的。所以遍历数组,看最远能够到达的位置,是否能到最后一个下标即可。 代码 class Solution { public: bool canJump(vector<int>& nums) { int right = 0;//一开始最远到达的位置为0

题目 给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配。 '?' 可以匹配任何单个字符。 '*' 可以匹配任意字符串(包括空字符串)。 两个字符串完全匹配才算匹配成功。 说明: s 可能为空,且只包含从 a-z 的小写字母。 p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。 示例 1: 输入: s = "aa" p = "a" 输出: false 解释: "a" 无法匹配 "aa" 整个字符串。 示例 2: 输入: s = "aa" p = "" 输出: true 解释: '' 可以匹配任意字符串。 示例 3: 输入: s = "cb" p = "?a" 输出: false 解释: '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。 示例 4: 输入: s = "adceb" p = "ab" 输出: tru

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:你不能倾斜容器。 输入:[1,8,6,2,5,4,8,3,7] 输出:49 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。 示例 2: 输入:height = [1,1] 输出:1 思路 两条垂线和x轴组成一个容器,这个容器的面积决定了盛水量。面积越大,盛水量越多。 每两条垂线组合,就是一个容器面积。比较所有的垂线组合,取面积最大值就是答案。 首先取开头和末尾的两条垂线。假设开头为i,末尾为j。此时容器的面积取决于高度较小的垂线。 假设高度较小的垂线为i,那么容器面积就是height[i]*(j-i)。 而此时,i垂线和j左侧所有垂线组成的容器,其面积都比(i,j)组成的容器面积小。 因为(j-i)变小了。而容器高度不变,或者也变小了。因为j左侧所有垂

题目 给你一个大小为 m x n 的网格和一个球。球的起始坐标为 [startRow, startColumn] 。你可以将球移到在四个方向上相邻的单元格内(可以穿过网格边界到达网格之外)。你 最多 可以移动 maxMove 次球。 给你五个整数 m、n、maxMove、startRow 以及 startColumn ,找出并返回可以将球移出边界的路径数量。因为答案可能非常大,返回对 109 + 7 取余 后的结果。 提示: 1 <= m, n <= 50 0 <= maxMove <= 50 0 <= startRow < m 0 <= startColumn < n 思路 定义dp[i][j][k]表示坐标(i,j),最多移动k次,出界的路径数。当k位于最中间,k<i,k<j,k<m-i,k<n-j。时,怎么都无法出界。直接返回0。状态转移方程为:dp[i][j][k] += dp[i+x][j+y][k-1],x=0、1或-1,y=0、1或-1。 代码 class Solution { vector&