leetcode-118-楊輝三角(pascl triangle)-java
阿新 • • 發佈:2018-10-31
題目及測試
package pid118; /*帕斯卡三角形 給定一個非負整數 numRows,生成楊輝三角的前 numRows 行。 在楊輝三角中,每個數是它左上方和右上方的數的和。 示例: 輸入: 5 輸出: [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] */ import java.util.List; public class main { public static void main(String[] args) { int[] testTable = {7,1,5,3,6,4}; for (int ito : testTable) { test(ito); } } private static void test(int ito) { Solution solution = new Solution(); List<List<Integer>> rtn; long begin = System.currentTimeMillis(); System.out.print(ito+" "); System.out.println(); //開始時列印陣列 rtn = solution.generate(ito);//執行程式 long end = System.currentTimeMillis(); //System.out.println(ito + ": rtn=" + rtn); System.out.println( " rtn=" ); for (int i = 0; i < rtn.size(); i++) { List<Integer> now=rtn.get(i); for(int j=0;j<now.size();j++){ System.out.print(now.get(j)+" "); } System.out.println(); }//列印結果幾陣列 System.out.println(); System.out.println("耗時:" + (end - begin) + "ms"); System.out.println("-------------------"); } }
解法1(成功,1ms,超快)
每行首部加1,然後加入 上一行的get(j-1)+get(j)
然後到中間,取同一行之前的數
package pid118; import java.util.ArrayList; import java.util.List; class Solution { public List<List<Integer>> generate(int numRows) { if(numRows==0){ List<List<Integer>> result=new ArrayList<>(); return result; } if(numRows==1){ List<List<Integer>> result=new ArrayList<>(); List<Integer> now=new ArrayList<>(); now.add(1); result.add(now); return result; } if(numRows==2){ List<List<Integer>> result=new ArrayList<>(); List<Integer> now=new ArrayList<>(); now.add(1); result.add(now); now=new ArrayList<>(); now.add(1); now.add(1); result.add(now); return result; } List<List<Integer>> result=new ArrayList<>(); List<Integer> now=new ArrayList<>(); List<Integer> prev; now.add(1); result.add(now); now=new ArrayList<>(); now.add(1); now.add(1); result.add(now); prev=now; for(int i=3;i<numRows+1;i++){ now=new ArrayList<>(); now.add(1); int mid=i>>>1; for(int j=1;j<mid+1;j++){ now.add(prev.get(j-1)+prev.get(j)); } for(int j=mid+1;j<i;j++){ now.add(now.get(i-j-1)); } result.add(now); prev=now; } return result; } }
解法2(別人的)
與我的類似,只是全部用上一行的資料
每一行的首元素和尾元素均為1,並且它們在上一行沒有對應的左上方或右上方元素,故我們應該單獨處理,對於中間的元素,就只需要獲得它的左上方的元素和右上方的元素之和即可。
class Solution { public List<List<Integer>> generate(int numRows) { List<List<Integer>> list_All = new ArrayList<List<Integer>>(); if(numRows<1){ return list_All; } List<Integer> list1 = new ArrayList<Integer>(); list1.add(1); list_All.add(list1); for(int i=2;i<=numRows;i++){ List<Integer> list = new ArrayList<Integer>(); list.add(1); List<Integer> list_pre = list_All.get(i-2); for(int j=1;j<i-1;j++) { list.add(list_pre.get(j-1)+list_pre.get(j)); } list.add(1); list_All.add(list); } return list_All; } }