楊輝三角(二)

給定一個非負索引 k,其中 k ≤ 33,返回楊輝三角的第 k 行。
示例:
輸入: 3
輸出: [1,3,3,1]
進階:
你可以優化你的算法到 O(k) 空間複雜度嗎?

第一次提交
注意
List<List> tan = new ArrayList<List>();
tan.add(new ArrayList());
List newrow = new ArrayList();

class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<List<Integer>> tan = new ArrayList<List<Integer>>();
        //0 row
        tan.add(new ArrayList<Integer>());
        tan.get(0).add(1);
        for(int i = 1 ; i < 34 ; i++){
            List<Integer> newrow = new ArrayList<Integer>();
            List<Integer> prerow = tan.get(i-1);
            newrow.add(1);
            for(int j = 1;j<i;j++){
                newrow.add(prerow.get(j-1)+prerow.get(j));
            }
            newrow.add(1);
            tan.add(newrow);
        }
        return tan.get(rowIndex);
    }
}

很明顯,複雜度是O(n^2),因爲整個新建了一個33行的List,最笨的方法。不過楊輝三角的默寫算是達標了。

評論區的:

public List<Integer> getRow(int rowIndex) {
        List<Integer> resultList = new ArrayList<Integer>();
        int middle = (rowIndex + 1)/2;
        boolean needY = (rowIndex%2 == 0);
        if(rowIndex == 0){
            resultList.add(1);
            return resultList;
        }
        int i = 0;
        for(; i < middle; i++){
            int yI= getYI(rowIndex,i,resultList);

            resultList.add(i,yI);
            resultList.add(i+1,yI);
        }
        if(needY){
            resultList.add(i,getYI(rowIndex,i,resultList));
        }
        return resultList;
    }
    
    public int getYI(int rowIndex,int i,List<Integer> list){
        if(i == 0){
            return 1;
        }else{
            double a = (double)list.get(i) * (double)(rowIndex - i + 1);
            double b = a / i;
            return (int) (b);
        }
    }

c++

vector<int> getRow(int rowIndex) {
    vector<int> result(rowIndex+1);
    result[0] = 1;
    for(int i = 1; i != rowIndex + 1; i++)
    {
        result[i] = 1;
        for(int j = i-1; j != 0; j--)
        {                
            result[j] += result[j-1];
        }
    }//for
    return result;
}

還有

public List<Integer> getRow(int rowIndex) {
        List<Integer> result = new LinkedList<>();
        int num = 1;
        for(int i = 0 ; i <= rowIndex; i++){
            result.add(num);
            num = num * (rowIndex-i) / (i + 1);
        }
        return result;
    }

66%的

class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<Integer> row1=new ArrayList<Integer>();
        row1.add(1);
		if (rowIndex==0) {
			return row1;
		}
		for (int i = 1; i <=rowIndex; i++) {
			Iterator<Integer> it=row1.iterator();
			int a=0;
			List<Integer> row2=new ArrayList<Integer>();
			while (it.hasNext()) {
				int b=it.next();
				row2.add(a+b);
				a=b;
			}
			row2.add(1);
			row1=row2;
		}
		return row1;
    }
}

67.9%

class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<Integer> result = new ArrayList<>(rowIndex + 1);

        for (int i = 0; i < rowIndex + 1; i++) {
            result.add(1);
            for (int j = i -1; j > 0; j--) {
                result.set(j, result.get(j) + result.get(j - 1));
            }
        }

        return result;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章