第一题:经典爬楼梯问题
假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部?
样例 1:
输入: n= 3
输出: 3
样例解释:
1) 1, 1, 1
2) 1, 2
3) 2, 1
共3种
样例 2:
输入: n = 1
输出: 1
解释:
只有一种方案
public class Solution {
/**
* @param n: An integer
* @return: An integer
*/
public int climbStairs(int n) {
int[] dp = new int[1000];
dp[1] = 1;
dp[2] = 2;
for(int i=3;i<=n;i++){
dp[i] = dp[i-1]+dp[i-2];
}
return dp[n];
}
}
第二题: 最小路径和
给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径。
你在同一时间只能向下或者向右移动一步
样例 1:
输入: [[1,3,1],[1,5,1],[4,2,1]]
输出: 7
样例解释:
路线为: 1 -> 3 -> 1 -> 1 -> 1。
样例 2:
输入: [[1,3,2]]
输出: 6
解释:
路线是: 1 -> 3 -> 2
补充知识:如何求二维数组行和列的值?
int [][] arr = new int[3][4];
System.out.println(arr.length); //打印出二维数组的行数:3
System.out.println(arr[0].length); //打印出二维数组的列数:4
arr.length这个经常被我弄错,arr.length打印出的是二维数组的行数,而不是12!
public class Solution {
/**
* @param grid: a list of lists of integers
* @return: An integer, minimizes the sum of all numbers along its path
*/
public int minPathSum(int[][] grid) {
if(grid==null||grid[0]==null){
return -1;
}
int m = grid.length;
int n = grid[0].length;
int[][] dp = new int[m][n];
dp[0][0] = grid[0][0];
for(int i=1;i<n;i++){
dp[0][i] =