采用2项公式解这问题挺简单,唯一需要注意的是当两个比较大的数相乘时,容易越界,我采用分子、分母同时除以他们的最大公约数。
下面是AC代码:
1 /** 2 * Given an index k, return the kth row of the Pascal's triangle. 3 * only O(k) extra space 4 * @param rowIndex 5 * @return 6 */ 7 public ArrayList<Integer> getRow(int rowIndex){ 8 ArrayList<Integer> r = new ArrayList<Integer>(); 9 if(rowIndex<0) 10 return r; 11 r.add(1); 12 if(rowIndex == 0) 13 return r; 14 for(int i=1;i<rowIndex;i++){ 15 //It's very important here!! handle the big number that's out of range 16 if(r.get(i-1)>Math.pow(2, 31)/(rowIndex-i+1)) 17 { 18 int t = gcd(r.get(i-1),i); 19 int temp = r.get(i-1)/t * (rowIndex-i+1)*t/i; 20 System.out.println(temp); 21 r.add(temp); 22 continue; 23 } 24 25 int temp = r.get(i-1)*(rowIndex-i+1)/i; 26 r.add(temp); 27 } 28 r.add(1); 29 return r; 30 } 31 /** 32 * 求最大公约数,为了处理大整数 33 * @param a 34 * @param b 35 * @return 36 */ 37 private int gcd(int a, int b){ 38 while(a%b!=0){ 39 int t = b; 40 b = a%b; 41 a = t; 42 } 43 return b; 44 } 45