70. 爬楼梯&118. 杨辉三角 leetcode hot100

70 阅读1分钟

image.png

image.png

class Solution {
    public int climbStairs(int n) {
        int[] dp = new int[n + 1];
        dp[0] = 1;
        dp[1] = 1;
        for(int i = 2; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
}

image.png

image.png

方法1:循环嵌套

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> abs =new ArrayList<List<Integer>>();
        //创建动态数组“外数组”;
        for(int i=0;i<numRows;i++)
        {
            List<Integer> bs=new ArrayList<Integer>();//“内数组”一定要放外循环里面,可以初始化;
            for(int j=0;j<=i;j++)
            {
                if(j==0||j==i)//判断是否为第一个和最后一个
                {
                    bs.add(1);
                }
                else//如果不是就区前面的数组值来相加;
                {
                    bs.add(abs.get(i-1).get(j-1)+abs.get(i-1).get(j));
                } //abs.get()是取数组值的方法;
            }
            abs.add(bs);//将处理好的内数组放入外数组的员孙中;
        }
        return abs;//返回最后的答案;

    }
}

方法2:动态规划

image.png

class Solution {
    public List<List<Integer>> generate(int numRows) {
		List<List<Integer>> result=new ArrayList<List<Integer>>();
		int[][] dp=new int[numRows][numRows];
		dp[0][0]=1;
		for (int i = 1; i < numRows; i++) {
			for (int j = 0; j <=i; j++) {
				if(j==0)dp[i][j]=1;
				else dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
			}
		}
		for (int i = 0; i < dp.length; i++) {
			List<Integer> tmp=new ArrayList<>();
			for (int j = 0; j < dp.length; j++) {
				if(dp[i][j]==0) break;
				tmp.add(dp[i][j]);
			}
			result.add(new ArrayList<>(tmp));
		}
		
		return result;
    }
}