leetcode刷题记录-119.杨辉三角2[java,数组]

题目

给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。

我的代码

class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<Integer> firstline = new ArrayList();
        firstline.add(1);
        if (rowIndex == 0) {return firstline;}
        List <Integer> secondline = new ArrayList();
        secondline.add(1);
        secondline.add(1);
        if (rowIndex == 1) {return secondline;}
        
        List<Integer> lastturn = secondline;
        for (int i=2; i<=rowIndex; i++){
            List<Integer> thisturn = new ArrayList();
            thisturn.add(1);
            for (int j=1; j<lastturn.size(); j++){
                thisturn.add(lastturn.get(j-1) + lastturn.get(j));
            }
            thisturn.add(1);
            
            lastturn = thisturn;
        }
        return lastturn;        
    }
}

小结

首先要承认,这里回去抄了杨辉三角1的代码。并回忆起了,写1的时候,我本想直接计算每一行(用组合数),然后被计算阶层卡住,没想到又一次遇到了,我还是不能很好地处理阶层问题,这次一定要好好学一学。

他人代码

class Solution {
    public List<Integer> getRow(int rowIndex) {
        
        List<Integer> list = new ArrayList<>(rowIndex + 1);
        
        long s = 1;
        
        for(int i = 0; i <= rowIndex; i++){
            list.add((int)s);
            s = s * (rowIndex - i) / (i + 1);
        }
        
        return list;
    }
}

按照组合数公式,第i个数(从0开始)是 C r o w I n d e x + 1 i = ( r o w I n d e x + 1 ) ! i ! ∗ ( r o w I n d e x + 1 − i ) ! C_{rowIndex+1}^{i}=\frac{(rowIndex+1)!}{i!*(rowIndex+1-i)!} CrowIndex+1i=i!(rowIndex+1i)!(rowIndex+1)!(因为rowIndex从0开始数)
那么,第i+1个数是 C r o w I n d e x + 1 i + 1 = ( r o w I n d e x + 1 ) ! ( i + 1 ) ! ∗ ( r o w I n d e x − i ) ! C_{rowIndex+1}^{i+1}=\frac{(rowIndex+1)!}{(i+1)!*(rowIndex-i)!} CrowIndex+1i+1=(i+1)!(rowIndexi)!(rowIndex+1)!
两者相差 r o w I n d e x − i i + 1 \frac{rowIndex-i}{i+1} i+1rowIndexi

也就是大佬的代码的意思了。
十分受教!

你可能感兴趣的:(leetcode刷题记录-119.杨辉三角2[java,数组])