我用二项式解决了这个,其中溢出是用java的BigInteger解决的。但是看到大多数人是用定义解决的,计算量就不大,不会造成溢出
leetcode:https://oj.leetcode.com/problems/pascals-triangle/
Pascal's Triangle
Given numRows, generate the first numRows of Pascal's triangle.
For example, given numRows = 5,
Return
[ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ]
1 //这里的帕斯卡三角即杨辉三角 2 // 1 3 // 1 1 4 // 1 2 1 5 // 1 3 3 1 6 //用定义处理 7 //先将第一行1 put进去 8 //后面每一行的生成用先put第一个1和最后一个1 9 //中间的数字由下面的方法解决 10 //先取出上一行的list,用i和j指向上一行的第一个和第二个元素,两个相加得到这行的元素,知道j到上一行的最后一个元素 11 //将生成的list加入到集合中,生成最后的结果 12 public class Solution { 13 public List<List<Integer>> generate(int numRows) { 14 List<List<Integer>> set = new ArrayList<List<Integer>>(); 15 if(0 == numRows){ 16 17 } 18 else if(1 == numRows){//只求1行 19 List<Integer> listRow = new ArrayList<Integer>(); 20 Integer element = new Integer(1); 21 listRow.add(element); 22 set.add(listRow); 23 24 } 25 else{//>=2行 26 //先把第一行put进去 27 List<Integer> listRow = new ArrayList<Integer>(); 28 Integer element = new Integer(1); 29 listRow.add(element); 30 set.add(listRow); 31 //找出所有的行 32 for(int n = 1; n < numRows; n++){ 33 //取出前一行的List 34 List preRowList = set.get(n -1); 35 //申明这一行的List并将第一个元素1add进去 36 List<Integer> nowRowList = new ArrayList<Integer>(); 37 nowRowList.add(new Integer(1)); 38 //开始找出除第一个1和最后一个的所有元素, 由定义计算出来 39 for(int i = 0, j = 1; j < preRowList.size(); i++, j++){ 40 Integer num_first = (Integer)preRowList.get(i); 41 Integer num_second = (Integer) preRowList.get(j); 42 nowRowList.add(new Integer(num_first + num_second)); 43 } 44 //添加最后一个1 45 nowRowList.add(new Integer(1)); 46 //添加到set集合中 47 set.add(nowRowList); 48 } 49 } 50 51 return set; 52 } 53 }