63. 不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1 和 0 来表示。
说明:m 和 n 的值均不超过 100。
示例 1:
1 | 输入: |
1 | class Solution { |
解释:这里的思想主要就是动态规划。
这里需要注意的是第一行和第一列,如果当前位于第一行(i = 0)
,则如果当前位置的左边是障碍物,则当前位置的值为0,即不可达,如果当前位于第一列(j = 0)
,则如果当前位置的上面是障碍物,则当前位置的值是0,即不可达。
其余位置考虑方法:
如果当前位置时障碍物,则ans[i][j] = 0
否则,ans[i][j] = ans[i - 1][j] + ans[i][j - 1]
最后返回右下角的值即可。
69. x的平方根
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
1 | 输入: 4 |
示例 2:
1 | 输入: 8 |
方法一:二分法
1 | class Solution { |
方法二:牛顿迭代法

1 | class Solution { |
75. 颜色分类
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。
示例:
1 | 输入: [2,0,2,1,1,0] |
荷兰旗问题
其主要思想是给每个数字设定一种颜色,并按照荷兰国旗颜色的顺序进行调整。
我们用三个指针(p0, p2和curr)来分别追踪0的最右边界,2的最左边界和当前考虑的元素。
本解法的思路是沿着数组移动curr
指针,若nums[curr] = 0
,则将其与nums[p0]
互换;若nums[curr]
= 2,则与nums[p2]
互换。
算法:
-
初始化0的最右边界:p0 = 0。在整个算法执行过程中 nums[idx < p0] = 0.
-
初始化2的最左边界 :p2 = n - 1。在整个算法执行过程中 nums[idx > p2] = 2.
-
初始化当前考虑的元素序号 :curr = 0.
-
While curr <= p2 :
- 若 nums[curr] = 0 :交换第 curr个 和 第p0个 元素,并将指针都向右移。
- 若 nums[curr] = 2 :交换第 curr个和第 p2个元素,并将 p2指针左移 。
- 若 nums[curr] = 1 :将指针curr右移。
1 | class Solution { |
76. 最小覆盖子串
给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。
示例:
1 | 输入: S = "ADOBECODEBANC", T = "ABC" |
说明:
如果 S 中不存这样的子串,则返回空字符串 “”。
如果 S 中存在这样的子串,我们保证它是唯一的答案。
1 | class Solution { |
解释:该问题属于滑动窗口问题。
首先遍历t,记录下每一个字母有多少个(记录在count数组中)
然后从头遍历s,即移动r,count[s[i]]--
,如果说减完之后,值仍然大于等于0,表示s[i]
在子串t当中,则len++,如果len == t.length()
,则表示当前要找的字符串已经全部包含在l ~ r
中。此时需要不比较minLength
和r - l + 1
,然后开始移动l,移动的时候++count[s[l++]]
,如果该值大于0,则表示这个字符是在t当中的,如果等于0,则表示不在t中(因为之前r遍历的时候减掉了,现在l遍历的时候加回去了,如果等于0,表示原来该字符就不在t中),所以当大于0的时候,就应该停止l的移动,表明已经滑动到新的在t中出现的字符了。