1.不同路径
class Solution {
public:
int uniquePaths(int m, int n) {
double num=1; // int k=min(m-1,n-1);
for(int i=1;i<m;i++){
num *= (i+n-1);
num /= i; }
int ans=int(num);
return(ans); }};
要点:
1.组合问题,问题等价于C(m-1,m+n-2)
2.问题在于越界,用double存储结果,然后强制类型转int
3.最好不要调用自定义函数,会让程序很慢
2.不同路径 II(有障碍物)
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) { if(obstacleGrid.size()==0||obstacleGrid[0].size()==0)
return 0;
int m=obstacleGrid.size(),n=obstacleGrid[0].size();//m行n列
//动态规划
vector<vector<long>>dp(m,vector<long>(n,0));
for(int i=0;i<m;i++) {
for(int j=0;j<n;j++) {
if(obstacleGrid[i][j]==1)//(i,j)为障碍
dp[i][j]=0;
else {
if(i==0&j==0)
dp[i][j]=1;//入口
else if(i==0)//第一行
dp[i][j]=dp[i][j-1];//第一行的只能由左边的到达
else if(j==0)//第一列
dp[i][j]=dp[i-1][j];//第一列的只能由上边到达
else
dp[i][j]=dp[i-1][j]+dp[i][j-1];//由上边+左边到达
} } }
return dp[m-1][n-1]; }};
要点:
1.第一行只能由左边的跳,第一列只能由上边的跳,有障碍dp=0,其他为左+上,直到点(m-1,n-1)
2.数组初始化方式vector<vector>dp(m,vector(n,0));
3.最小路径和
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int n=grid.size(),m=grid[0].size();//n行m列
vector<vector<int>>dp(n,vector<int>(m,0));
//动态规划
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if(i==0&&j==0) dp[i][j]=grid[i][j];
else if(i==0) dp[i][j]=dp[i][j-1]+grid[i][j];
else if(j==0)dp[i][j]=dp[i-1][j]+grid[i][j];
else dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j]; } } return dp[n-1][m-1]; }};
要点:
1.也是动态规划啦,找好边界条件就好
4.加一
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
if(digits.size()==1&&digits[0]==0)
return {1};
else {
int num;
if(digits.back()<9)
digits.back() += 1;
else{
int i=digits.size()-1;
for(i;i>=0&&digits[i]==9;i--) {
digits[i]=0; }
if(i>=0)
digits[i]+=1;
else
digits.insert(digits.begin(),1); }
return digits; } }};
要点:
1.如果最后一位数<9,加一后不产生进位,则直接加
2.如果最后一位加一>9,即该位为9,变为0;前一位加一
3.如果只有一位数且为9,则插入第一位1,第二位为0