1. 程式人生 > >Java&LeetCode 初入門——118. 楊輝三角

Java&LeetCode 初入門——118. 楊輝三角

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;
    }
}