LeetCode刷題:楊輝三角 II

題目

給定一個非負索引 k,其中 k ≤ 33,返回楊輝三角的第 k 行。
在楊輝三角中,每個數是它左上方和右上方的數的和。

示例:

輸入: 3
輸出: [1,3,3,1]
進階:

你可以優化你的算法到 O(k) 空間複雜度嗎?

題解
根據楊輝三角的性質,利用下一行除了首尾兩數其餘都爲上一行的兩數之和。
時間和內存消耗爲:
在這裏插入圖片描述
代碼爲:

class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<Integer> list=new ArrayList<>();
        if(rowIndex==0){
            list.add(1);
            return list;
        }
        if(rowIndex==1){
            list.add(1);
            list.add(1);
            return list;
        }
        //List<Integer> tmp=new ArrayList<>()(Arrays.asList(1,1));
        List<Integer> tmp=new ArrayList<>();
        tmp.add(1);
        tmp.add(1);
        for(int i=2;i<=rowIndex;i++){
            list=new ArrayList<>();
            for(int j=0;j<=i;j++){
                if(j==0||j==i){//首尾爲1
                    list.add(1);
                }else{
                list.add(tmp.get(j-1)+tmp.get(j));
                }
            }
            tmp=list;
        }
        return list;
    }
}

題解2
楊輝三角的性質,還有一條是第n行的m個數可表示爲 C(n-1,m-1),即爲從n-1個不同元素中取m-1個元素的組合數。那麼每個數是前一個數的(n-i)/(i+1)倍。
時間和內存消耗爲:
在這裏插入圖片描述
代碼爲:

		class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<Integer> list=new ArrayList<>();
        long num=1;
        for(int i=0;i<=rowIndex;i++){
            list.add((int)num);
            num=num*(rowIndex-i)/(i+1);
        }
        return list;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章