开始肝题目2

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值