前言:
本专栏只专注动态规划的解法,若有其它简便解法暂不考虑。
从几乎零基础开始学算法,多多包涵,共同进步!
杨辉三角一
杨辉三角是不需要了解动态规划,就能用动态规划解法做出来的动态规划的入门典例,因为你有意无意就能用动态规划的解法来解题。
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
for (int i = 0; i < numRows; i++){//行
List<Integer> row = new ArrayList<Integer>();
for(int j = 0;j<= i;j++){//列
if (j==0 || j==i){
row.add(1);
}else{
row.add(ans.get(i-1).get(j-1)+ans.get(i-1).get(j));
}
}
ans.add(row);
}
return ans;
}
}
思路:按题意就指明了每个数是左上方和右上方的数的和。
直接两层循环解决。
注意:每行的第一个数和最后一个数都是1;
返回类型为List<List>,要了解一定的List集合知识
杨辉三角二
class Solution {
public List<Integer> getRow(int rowIndex) {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
for (int i = 0; i <= rowIndex; i++){//行
List<Integer> row = new ArrayList<Integer>();
for(int j = 0;j<= i;j++){//列
if (j==0 || j==i){
row.add(1);
}else{
row.add(ans.get(i-1).get(j-1)+ans.get(i-1).get(j));
}
if(i==rowIndex&&j==rowIndex) return row;
}
ans.add(row);
}
return null;
}
}
思路:跟上一题大同小异,差别就是返回类型为List,所以直接拷
贝,再稍加修改,在内层循环里面加上一个判断
if(irowIndex&&jrowIndex) return row;
爬楼梯
class Solution {
public int climbStairs(int n) {
int q = 0,p = 1,t=0;
for(int i = 0;i<n;i++){
t = q;
q = p;
p = t + p;
}
return p;
}
}
思路:题目刚入手,我其实也很懵, 看不出来什么结果,只好一个一个的列举出来,如图:
不难看出规律:f(x)=f(x−1)+f(x−2)
得出规律很简单,类似于上面的杨辉三角那样做就行了。
但这里需要用到滚动数组的思想,
主要是记录中间量:x-1和x-2;
扩展思考:但到这里,为什么会有这样的规律f(x)=f(x−1)+f(x−2)??
能否证明出来?