原题目
Given a non-negative index k where k ≤ 33, return the kth index row of the Pascal's triangle.
Note that the row index starts from 0.
In Pascal's triangle, each number is the sum of the two numbers directly above it.
Example:
Input: 3 Output: [1,3,3,1]
Follow up:
Could you optimize your algorithm to use only O(k) extra space?
中文题意
杨辉三角问题,就是每一行中每个元素为头顶两个元素之和,每一行的第一位和最后一位为1。
分析
1.从数学的角度,发现每个元素的数学计算规律,然后使用数学方法计算特定位置上的值;
2.如果不使用纯数学方法,从第0行开始逐层向下推导,那么可以计算出前面每行的分布,最后得到所求行的元素。
java实现
方法一:从第0行开始逐层求出每层的元素,然后求出指定行的元素信息。
使用一个集合ori来存储每行的信息,这样下面一行会覆盖前面一行的信息。在逐个向ori中添加计算出的新结果时,会覆盖前面一层在该位置的信息,那么使用pre记录被覆盖的元素值,作为求下一个结果的和因子。
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> ori = new ArrayList<Integer>();
ori.add(new Integer(1));
if(rowIndex == 0){
return ori;
}
int pre = 0;
int curr = 0;
int i = 1;
while(i <= rowIndex){
pre = ori.get(0).intValue();
for(int j = 1; j< i; j++){
curr = ori.get(j).intValue();//当前位置的元素未被处理,作为下一个元素的和因子
ori.set(j,new Integer(pre+curr));//当前位置的元素被处理,为头顶两个元素的和
pre = curr;//将当前位置原来的值赋值给pre,作为记录。
}
ori.add(new Integer(1));
i++;
}
return ori;
}
}
方法二:创建新的集合来存储每一行的值,下一行的值使用前一行对应的数组来计算。
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> ori = new ArrayList<Integer>();
List<Integer> now;
ori.add(new Integer(1));
if(rowIndex == 0){
return ori;
}else if(rowIndex == 1){
ori.add(new Integer(1));
return ori;
}else{
ori.add(new Integer(1));
int count = 1;
for(int i = 2; i <= rowIndex;i++){
now = new ArrayList<Integer>();
now.add(new Integer(1));
for(int j = 1; j < i ;j++){
now.add(ori.get(j-1)+ori.get(j));
}
now.add(new Integer(1));
ori = now;
}
return ori;
}
//return ori;
}
}
方法三:使用数学的计算公式。
第n行第k个位置的值为:C(n,k),n从0开始,k从0开始。
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> ori = new ArrayList<Integer>();
double temp = 1;
int n = rowIndex;
ori.add(new Integer(1));
if(rowIndex == 0){
return ori;
}
if(rowIndex > 1){
for(int i = 1;i < rowIndex ;i++){
temp = temp * (n--);
temp = temp /i;
ori.add(new Integer((int)temp));
}
}
ori.add(new Integer(1));
return ori;
}
}