76. 最小覆盖子串
给定两个字符串 s 和 t,长度分别是 m 和 n,返回 s 中的 最短窗口 子串,使得该子串包含 t 中的每一个字符(包括重复字符)。如果没有这样的子串,返回空字符串 “”。
测试用例保证答案唯一。
示例 1:
**输入:**s = “ADOBECODEBANC”, t = “ABC”
输出:“BANC”
**解释:**最小覆盖子串 “BANC” 包含来自字符串 t 的 ‘A’、‘B’ 和 ‘C’。
示例 2:
**输入:**s = “a”, t = “a”
输出:“a”
**解释:**整个字符串 s 是最小覆盖子串。
示例 3:
输入: s = “a”, t = “aa”
输出: “”
解释: t 中两个字符 ‘a’ 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。
提示:
m == s.length
n == t.length
1 <= m, n <= 10(5)
s 和 t 由英文字母组成
先考虑暴力方法,遍历s以每个字母为首字符,再不断向右读字符
其实就是使用滑动窗口,这样我们可以考虑只有满足条件时左边界收缩,然后右边界扩张寻找下一次满足条件 ...
73. 矩阵置零
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法**。**
示例 1:
**输入:**matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]
示例 2:
**输入:**matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
提示:
m == matrix.length
n == matrix[0].length
1 <= m, n <= 200
-2(31) <= matrix[i][j] <= 2(31) - 1
进阶:
一个直观的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
你能想出一个仅使用常量空间的解决方案吗?
首先想到的是用两个数组,分别记录 哪几行,哪几列 需要置零
想优化到常量空间就要利用原数组来记录,为了不影 ...
72. 编辑距离
给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符
删除一个字符
替换一个字符
示例 1:
**输入:**word1 = “horse”, word2 = “ros”
**输出:**3
解释:
horse -> rorse (将 ‘h’ 替换为 ‘r’)
rorse -> rose (删除 ‘r’)
rose -> ros (删除 ‘e’)
示例 2:
**输入:**word1 = “intention”, word2 = “execution”
**输出:**5
解释:
intention -> inention (删除 ‘t’)
inention -> enention (将 ‘i’ 替换为 ‘e’)
enention -> exention (将 ‘n’ 替换为 ‘x’)
exention -> exection (将 ‘n’ 替换为 ‘c’)
exection -> execution (插入 ‘u’)
提示:
0 < ...
70. 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
**输入:**n = 2
**输出:**2
**解释:**有两种方法可以爬到楼顶。\
1 阶 + 1 阶\
2 阶
示例 2:
**输入:**n = 3
**输出:**3
**解释:**有三种方法可以爬到楼顶。\
1 阶 + 1 阶 + 1 阶\
1 阶 + 2 阶\
2 阶 + 1 阶
提示:
1 <= n <= 45
动态规划 dp[n] = dp[n-2] + dp[n-1]
因为只与前两个状态有关,所以可以使用两个变量
1234567891011121314class Solution { public : int climbStairs(int n) { if (n <= 3) return n; int dp1 = 1; int dp2 = 2; for (int i = 3; i <= n; i++) ...
56. 合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [start(i), end(i)] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 1:
**输入:**intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
**解释:**区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
**输入:**intervals = [[1,4],[4,5]]
输出:[[1,5]]
**解释:**区间 [1,4] 和 [4,5] 可被视为重叠区间。
示例 3:
**输入:**intervals = [[4,7],[1,4]]
输出:[[1,7]]
**解释:**区间 [1,4] 和 [4,7] 可被视为重叠区间。
提示:
1 <= intervals.length <= 10(4)
intervals[i].length == 2
0 <= start(i) <= end(i) ...
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 <= 10(4)
0 <= nums[i] <= 10(5)
起点和终点是唯一确定的
要保证存在格子能到达终点,理论上格子内的数越大越好,离终点越近越好,所以我们可以依次寻找能到达终点的最近的格子,这样只需要判断前一个格子能否到达这个最近格即可
1234567891011121314151617class Solutio ...







