Java&LeetCode 初入門——118. 楊輝三角
阿新 • • 發佈:2019-01-14
Java&LeetCode 初入門——118. 楊輝三角
文內程式碼全部採用JAVA語言。
題目
給定一個非負整數 numRows,生成楊輝三角的前 numRows 行。在楊輝三角中,每個數是它左上方和右上方的數的和。
測試用例
輸入: 5
輸出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
個人解法
楊輝三角大家都很熟悉了。這題的輸入是三角的行數,輸出是雙層List,內層的list是每一行的數字集合,外層是內層list的集合。這個還是很好理解的。
思路是遍歷。首先對行數numRows迴圈,再對每一行的元素迴圈。ArrayList提供了迭代器可以使用。對於特殊的numRows=0和的情況,都不能通過迴圈生成,所以直接if,返回答案。對於新的一行的產生,需要遍歷上層行的元素,因此新建兩個ArrayList,row1和row2。具體解釋參見程式碼中註釋。
執行用時: 1 ms, 在Pascal’s Triangle的Java提交中擊敗了95.00% 的使用者
class Solution {
public List<List<Integer>> generate(int numRows) {
List< Integer> row1=new ArrayList<Integer>();//上層行
List<List<Integer>> ans=new ArrayList<List<Integer>>();//輸出答案
if (numRows==0) {
return ans;//輸入0,返回[]
}
row1.add(1);//第一行的初始值[1]
ans.add(row1);//將第一行放入答案
if (numRows==1) {
return ans;//輸入1,返回[[1]]
}
for (int i = 2; i <=numRows; i++) {
//從行數大於等於2時,可以開始遍歷求解。迴圈體用不到i,只是用於計數
Iterator<Integer> it=row1.iterator();
//生成迭代器,對上層的元素進行遍歷。比如i=3時,迭代迴圈第二行
int a=0;//a用於存放前一個加數。
List<Integer> row2=new ArrayList<Integer>();//新建row2,存放和值
while (it.hasNext()) {
int b=it.next();//b是每行第一個數到最後一個數
row2.add(a+b);//在row2中新增和值
a=b;//向後移動
}
row2.add(1);//每行最後一個值,全都是1
row1=row2;//準備求row2下一行,這時需要遍歷row2
ans.add(row2);//將row2新增到ans
}
return ans;
}
}
官方解法
思路
如果能夠知道一行楊輝三角,我們就可以根據每對相鄰的值輕鬆地計算出它的下一行。
演算法
與個人解法基本一致,只是這裡用的是ArrayList.get,使程式碼看起來較為簡潔。同樣是巢狀兩層迴圈,執行時間也差不多,都是1ms。
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> triangle = new ArrayList<List<Integer>>();
// First base case; if user requests zero rows, they get zero rows.
if (numRows == 0) {
return triangle;
}
// Second base case; first row is always [1].
triangle.add(new ArrayList<>());
triangle.get(0).add(1);
for (int rowNum = 1; rowNum < numRows; rowNum++) {
List<Integer> row = new ArrayList<>();
List<Integer> prevRow = triangle.get(rowNum-1);
// The first row element is always 1.
row.add(1);
// Each triangle element (other than the first and last of each row)
// is equal to the sum of the elements above-and-to-the-left and
// above-and-to-the-right.
for (int j = 1; j < rowNum; j++) {
row.add(prevRow.get(j-1) + prevRow.get(j));
}
// The last row element is always 1.
row.add(1);
triangle.add(row);
}
return triangle;
}
}