Content
62 Unique Paths(M)
Description
Analysis & Solution
可以用动态规划解决,dp[i][j]表示从起点走到(i,j)位置可以选择的路径数目。
初始条件:dp[i][0]=dp[0][i]=1。
状态转移方程:dp[i][j]=dp[i-1][j]+dp[i][j-1]
Code
public int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
//第一列都是1
for (int i = 0; i < m; i++) {
dp[i][0] = 1;
}
//第一行都是1
for (int i = 0; i < n; i++) {
dp[0][i] = 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];
}
时间复杂度:两层循环,时间复杂度为 O ( m n ) O(mn) O(mn)。
70 Climbing Stairs(E)
Description
Analysis & Solution
经典的递归问题,可以用记录结果的递归减少重复计算,或者直接用动态规划求解。
Code
class Solution {
public:
int climbStairs(int n) {
int p = 0, q = 0, r = 1;
for (int i = 1; i <= n; ++i) {
p = q;
q = r;
r = p + q;
}
return r;
}
};
时间复杂度:一次循环,时间复杂度为 O ( n ) O(n) O(n)。
78 Subsets(M)
Description
Analysis & Solution
回溯法+DFS
Code
class Solution {
public:
vector<vector<int>> ans={{}};
void func(vector<int>& nums,vector<int>& t,int i)
{
for(int j=i;j<nums.size();j++)
{
t.push_back(nums[j]);
ans.push_back(t);
func(nums,t,j+1);
t.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
vector<int> t={};
func(nums,t,0);
return ans;
}
};