第一次写博客以及今晚刷题的一些心得
2020.8.8
今天是我第一次写博客啊,是一个值得纪念的日子。其实很早就有想法想要开始写博客了,但是拖延了这么久的原因,最主要的还是自己太懒了…
不过既然有了个开头,就好好的坚持下去吧,就分享一些每天学习到的新知识以及每天刷题后的想法与心得。
写一下今晚在LeetCode刷的几道题的想法吧,如果没做出来就是贴一下别人大神的好的解题思路。
1.剑指 Offer 43. 1~n整数中1出现的次数
题目:给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof
这道题归到了中等题,想了一段时间,但是没啥思路。参考了一下题解里面一位大神的想法。
每次取后最后两位数,n = num/100;
如果n>25,则这两位数无法翻译成一个字母,然后往前递归移动一位translateNum(n/10)
如果0<n<10,就是n处于00~09之间,这按照题目的意思是无法翻译的,也要translateNum(n/10)
如果10<n<25,那么就是这两位数都是可以翻译的,所以用translateNum(num/10) + translateNum(num/100)递归来计算数量。
题解:
class Solution {
public:
int translateNum(int num) {
if (num < 10) return 1;
return (num%100 < 10 || num%100 > 25) ? translateNum(num/10) : translateNum(num/10) + translateNum(num/100);
}
};
当时我看到这个大神的代码如此之少,着实震惊了一下。说实话,感觉自己想的跟他想的完全不在一个档次上…官方的解法是运用动态规划,感觉自己还是要好好理解并且消化题目才行,不然连答案都看不懂真是有点太丢脸了…
2.剑指 Offer 47. 礼物的最大价值
在一个 m×n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?
示例 1:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 12
解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/li-wu-de-zui-da-jie-zhi-lcof
题解:
class Solution {
public:
int maxValue(vector<vector<int>>& grid) {
int r = grid.size();
int c = grid[0].size();
vector<vector<int>> res(r,vector<int>(c,0));//定义一个二维数组res表示总的价值
for(int i = 0;i < r; ++i){
for(int j = 0; j < c; ++j){
if(i == 0 && j == 0){
res[i][j] = grid[0][0];
}else if(i == 0){//判断边界情况
res[i][j] = res[i][j-1] + grid[i][j];
}else if(j == 0){//判断边界情况
res[i][j] = res[i-1][j] + grid[i][j];
}else{
res[i][j] = max(res[i-1][j],res[i][j-1]) + grid[i][j];
}
}
}
return res[r-1][c-1];
}
};
这道题还是比较简单的动态规划问题,可能唯一需要注意的地方就是边界情况的判断了。我刚开始还不清楚c++怎么定义一个二维数组,正好学习了一下。
> 初始化一个m x n的二维数组,初始值为0;
> vector<vector<int>dp(m, vector<int> (n));
今天就先写到这吧…看了很多题目,还是不知道怎么写…加油吧!
你会的越多,你不会的也就越多。