【数学】C017_杨辉三角(常规逻辑 | dp | 规律)

一、题目描述

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
输入: 5
输出:
[
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
]

二、题解

(1) 常规思路

/**
 * 执行用时 1 ms击败了98.45%的java用户
 * 内存消耗 39.7 MB击败了96.01%的java用户
 * @param numRows
 * @return
 */
public List<List<Integer>> generate(int numRows) {
  List<List<Integer>> ans = new ArrayList<>();
  if(numRows == 0)
    return ans;
  for (int i = 0; i < numRows; i++) {
    List<Integer> item = new LinkedList<Integer>();
    for (int j = 0; j <= i; j++) {
      if(j == 0 || i == j)
        item.add(1);
      else
        item.add(ans.get(i-1).get(j-1) + ans.get(i-1).get(j));
    }
    ans.add(item);
  }
  return ans;
}

复杂度分析

  • 时间复杂度:
  • 空间复杂度:

(2) 动态规划

/**
 * 1ms 击败98.45%
 * @param numRows
 * @return
 */
public List<List<Integer>> generate2(int numRows) {
  List<List<Integer>> ans = new ArrayList<List<Integer>>();
  if(numRows == 0)
    return ans;
  ans.add(new ArrayList<Integer>());
  ans.get(0).add(1);  // 第一行为1
  for (int rowNum = 1; rowNum < numRows; rowNum++) {
    ArrayList<Integer> rowList = new ArrayList<>();
    List<Integer> preRowList = ans.get(rowNum-1);
    rowList.add(1);
    for (int i = 1; i < rowNum; i++) {
      rowList.add(preRowList.get(i) + preRowList.get(i-1));
    }
    rowList.add(1); // 最后一行恒为1
    ans.add(rowList);
  }
  return ans;
}

(3) 有趣想法(规律)

/**
 * 有趣的想法:前一行只比上一行多了一个元素,本行元素等于上一行元素往后错一位再逐个相加,比如:
 *  1331
 * + 1331
 * ———————
 *  14641
 *
 * @param numRows
 * @return
 */
public List<List<Integer>> generate3(int numRows) {

  return null;
}

你可能感兴趣的:(#,【数学】)