在上一篇文章中簡單介紹了順序表,這一篇文章講解下一個比較經典的題:
楊輝三角
先看一下什么是楊輝三角
下面解釋:
大概就是這個規律。而 ta 其實就是二維數組 即:
0 1
1 1 1
2 1 2 1
3 1 3 3 1
4 1 4 6 4 1
然后看一下這個題的要求:
意思是 numRows 一個非負數(整數),在根據 numRows 里的整數生成 【楊輝三角?】的“層數”
這是ta給的方法體:
這里的 List <List<Integer>>這個邊講邊說
下面說一下 這道題如何解:
首先是步驟:
如果你仔細觀察這個圖就會發現 ta 的頭值和尾值都是 1 而中間的都是運算來的
所以可以將這道題分為 頭 中? 尾 三部分處理?
頭 尾處理比較簡單難點是 中 的處理,這時候 再仔細觀察 中間的值,是如何得出來的,你會發現:
0 101 1 10 12 1 2 10 1 23 1 3 3 10 1 2 3 4 1 4 6 4 10 1 2 3 4所有的中間值都是由 上一個數組以下標 0 + 1 | 1 + 2 | 2 + 3
的規律得出下一個數組 1下標 2下標 3下標 的值 如4數組:1下標 = 1+3 、2下標 = 3 + 3 、3下標 = 3+1就可以這樣寫:
i = 數組
while(ture){
j = 0;
int val = i[j] + i[j+1];
j++;
}
但這時候問題又出現了,以楊輝三角的規律不是那個數組,都有 1 2 3 下標的,這時候就要找條件
的要求了? 這時候再仔細看一下圖:
0 101 1 10 12 1 2 10 1 23 1 3 3 10 1 2 3 4 1 4 6 4 10 1 2 3 4會發現數組2需要加1次
數組3需要加2次
數組4需要加3次
后面相加的次數依次+1
只有 numRows 等于3時中間值需要加1次,4時加2次.......
這個題最好用順序表解決 下面看代碼:
public List<List<Integer>> generate(int numRows) {List<Integer> list = new ArrayList<>();//List<List<Integer>> ta 的意思就是如果你存放數組(順序表的底層是數組)的地址//會給這個地址放上 下標 ret是要返回的List<List<Integer>> ret = new ArrayList<>();//處理一層list.add(1);ret.add(list);//處理二層以上for(int i = 1; i<numRows; i++){//頭List<Integer> cj = new ArrayList<>();cj.add(1);//中//這里的 get 拿的是數組的整個地址List<Integer> zo = ret.get(i-1);//只有numRows 為3及以上才會運算for(int j = 0; j<i-1; j++){int val = zo.get(j) + zo.get(j+1);cj.add(val);}//尾cj.add(1);ret.add(cj);}return ret;}
List <List<Integer>>:
最后提交一下:
下一篇文章是 單向 無頭 不循環鏈表