本文链接:https://blog.csdn.net/qq_34811382/article/details/112852249
062、不同路径
思路:
方法一:每个方格的路线只有左面或者上面,所以给起始位置路径计做0,第一行和第一列的每个位置路径计做1,其他位置,只有上面和左面可以到达,因此,我们只计算左面和上面位置路径的和。
即(i,j)的路径=(i-1,j)+(i,j-1)的路径和。
class Solution
{
public:
int uniquePaths(int m, int n)
{
vector<vector<int>> PathMap(m, vector<int>(n, 0));
for (int i = 0; i < m; i++)
PathMap[i][0] = 1;
for (int i = 0; i < n; i++)
PathMap[0][i] = 1;
for (int i = 1; i < m; i++)
{
for (int j = 1; j < n; j++)
{
PathMap[i][j] = PathMap[i - 1][j] + PathMap[i][j - 1];
}
}
return PathMap[m - 1][n - 1];
}
};
用排列组合的方法:
从起点到终点,向下走的一共有m-1步,向右走的一共有n-1步,即一共走m+n-2步,从中抽出m-1步向下走的或者n-1步向右走的。所以一共有(m+n-2)!/(m-1)!(n-1)!
class Solution {
public:
int uniquePaths(int m, int n) {
long long ans = 1;
for (int x = n, y = 1; y < m; ++x, ++y) {
ans = ans * x / y;
}
return ans;
}
};
70、爬楼梯
思路:
斐波那契数列。f(1)=1,f(2)=2,f(3)=3,f(4)=5…
class Solution
{
public:
int climbStairs(int n)
{
if(n<=2)
return n;
int result = 0;
int front = 1, next = 2;
for (int i = 3; i <=n;i++){
result = front + next;
front = next;
next = result;
}
return result;
}
};
78、子集
思路:位运算
代码:
class Solution
{
public:
vector<vector<int>> subsets(vector<int> &nums)
{
int S = nums.size();
int N = 1 << S;
vector<vector<int>> res;
for (int i = 0; i < N; i++)
{
vector<int> v;
for (int j = 0; j < S; j++)
if (i & (1 << j))
v.push_back(nums[j]);
res.push_back(v);
}
return res;
}
};