題目如下(題目鏈接戳我):
給定一個(gè)非負(fù)整數(shù) numRows笆怠,生成楊輝三角的前 numRows 行逗栽。
備注:在楊輝三角中吕晌,每個(gè)數(shù)是它左上方和右上方的數(shù)的和。
示例:
輸入: 5
輸出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
也給出了楊輝三角的示例圖:
楊輝三角
以下是我的解題思路:
我首先整理了前 5 行楊輝三角的數(shù)據(jù)贿肩;
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
根據(jù)題目的返回值要求( List < List < Integer >> )(我在中括號(hào)和字母之間故意加了空格)峦椰,我把每一行看作一個(gè)集合龄寞,每個(gè)元素對(duì)應(yīng)一個(gè)下標(biāo)索引汰规,我把索引也整理了一下;
0
0 1
0 1 2
0 1 2 3
0 1 2 3 4
然后得出了以下幾條規(guī)律和方法:
- 第一個(gè)元素為1(這個(gè)其實(shí)不算規(guī)律物邑,就是事實(shí)溜哮,只是為了一會(huì)寫代碼時(shí)方便寫限制)
- 每一行數(shù)據(jù)集合 List< Integer > 的第一個(gè)元素為 1(也是事實(shí));
- 增加一個(gè)集合色解,用于記錄上一行的數(shù)值茂嗓;
- 每個(gè)元素等于上一個(gè)集合同索引的數(shù)值和前一個(gè)索引的數(shù)值的和(這也是個(gè)事實(shí),不過要加個(gè)限制科阎,見下條)述吸;
- 每行集合中最后一個(gè)元素(索引為index)只等于上一行集合中索引為 index-1 的值;
思路整理完了,剩下寫代碼就很簡(jiǎn)單了蝌矛。
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> list = new ArrayList<>();
List<Integer> item;//當(dāng)前行的集合
List<Integer> last = null; //上一行的集合
int index = 1; //行號(hào)道批,每行元素個(gè)數(shù)和行號(hào)一致
while (index <= numRows) {
item = new ArrayList<>();
//循環(huán)index次,向item中添加元素
a:
for (int i = 0; i < index; i++) {
if(last == null){
item.add(1);
break a;
}else if(i == 0){
item.add(1);
}else if(i == index - 1){
item.add(last.get(i - 1));
}else{
item.add(last.get(i - 1) + last.get(i));
}
}
last = item;
list.add(item);
index++;
}
return list;
}
提交結(jié)果:
執(zhí)行用時(shí) : 1 ms, 在Pascal's Triangle的Java提交中擊敗了97.86% 的用戶
內(nèi)存消耗 : 33.6 MB, 在Pascal's Triangle的Java提交中擊敗了39.51% 的用戶