Given an index k, return the kth row of the Pascal's triangle.
For example, given k = 3,
Return
[1,3,3,1]
.
Note:
Could you optimize your algorithm to use only O(k) extra space?
A:
-----------5th pass ------------比第四次又有精简----好无聊的感觉------
public class Solution { public List<Integer> getRow(int rowIndex) { List<Integer> list = new LinkedList<Integer>(); for(int i =0;i <= rowIndex;i++){ for(int j = 0;j < list.size()-1;j++) list.set(j, list.get(j) + list.get(j+1)); list.add(0,1); } return list; } }
---------4th pass ------------每次在原本的list上增加一个即可
public class Solution { public List<Integer> getRow(int rowIndex) { List<Integer> list = new LinkedList<Integer>(); if(rowIndex < 0) return list; list.add(1); for(int i =0;i<rowIndex;i++){ int lastSize = list.size(); for(int j =0;j<lastSize-1;j++) // set one as the sum of its above two list.set(j,list.get(j)+list.get(j+1)); list.add(0,1); } return list; } }
-----------------1th pass ---------多次声明新的List----------------
public class Solution { public ArrayList<Integer> getRow(int rowIndex) { ArrayList<Integer> al = new ArrayList<Integer>(); if(rowIndex<0) return al; al.add(1); for(int i = 0;i< rowIndex; i++){ ArrayList<Integer> newAl = new ArrayList<Integer>(); for(int j =0;j<al.size()-1;j++) newAl.add(al.get(j) + al.get(j+1)); newAl.add(0,1); newAl.add(1); al = newAl; } return al; } }
Mistakes:
1: 很恶心的是,这个行数,也是从0行开始算起。 哎,也算是自己的题意没有看清楚。
注意,人家给的参数的名字 是rowIndex
2:应该是在每一次,要计算,填入最新行的时候, 先清除本行。
而不是再上次用完之后,清除。(其实也没问题。但是,那样,返回的时候,就不方便了。)
----------------------------------2 nd Pass ---------------------
上面的空间,严格来讲,并不是O(k)的关系,因此,这次,声明了2个list
public class Solution { public ArrayList<Integer> getRow(int rowIndex) { ArrayList<Integer> al = new ArrayList<Integer>(); ArrayList<Integer> lastAl = new ArrayList<Integer>(); if(rowIndex <0) return al; al.add(1);// add 1 at beginning if(rowIndex == 0){ return al; } al.add(1);// add 1 at beginning if(rowIndex == 1){ return al; } lastAl.add(1); // so that we do not need to consider 1 for(int i =2;i<=rowIndex;i++){ ArrayList<Integer> tmp = lastAl; lastAl = al; al=tmp; // update al into a new value int nLast = lastAl.size(); for(int j = 1;j<nLast-1;j++){ al.set(j,lastAl.get(j-1)+lastAl.get(j)); } al.add( lastAl.get(nLast-1)+lastAl.get(nLast-2) ); al.add(1); } return al; } }
Error:
1: 当base = = 0 和1 的情况之后, 我们直接计算rowIndex>=2的情况的时候, 是基于==1的基础上的,,可是, al。add是在 if语句里的,造成了空的情况。
2: 我们的考量,是基于 last中的第一个,是1, 从而不用考虑的。
但是,当直接从2 开始计算的时候, 要考虑到,当前的 应该是i+2个数字的。 但是,原本接下来的空间,只有 i 个, 因此,最后要加2个。
public class Solution { public ArrayList<Integer> getRow(int rowIndex) { ArrayList<Integer> al = new ArrayList<Integer>(); ArrayList<Integer> lastAl = new ArrayList<Integer>(); al.add(1);// add 1 at beginning if(rowIndex == 0) return al; lastAl.add(1); for(int i =1;i<=rowIndex;i++){ ArrayList<Integer> tmp = lastAl; lastAl = al; al=tmp; // update al into a new value int nLast = lastAl.size(); for(int j = 1;j<nLast-1;j++){ al.set(j,lastAl.get(j-1)+lastAl.get(j)); } if(nLast-2>=0) // except for the row [1 1] al.add( lastAl.get(nLast-1)+lastAl.get(nLast-2) ); al.add(1); } return al; } }
No comments:
Post a Comment