杨辉三角Ⅱ

目录

一、需求

二、递归法

2.1  思路分析

2.2  代码实现

2.3  复杂度分析

三、数组法

3.1  思路分析

3.2  代码实现

3.3  代码优化

3.4  复杂度分析

四、公式法

4.1  思路分析

4.2  代码实现

4.3  代码优化

4.4  复杂度分析

五、参考地址


一、需求

      A:给定一个非负索引k,其中k<=33,返回杨辉三角的第k行;

二、递归法

2.1  思路分析

      A:首先新建两个List对象,其中一个当作中间变量来储存某行数据;

      B:若k==0,直接将1存到集合,并返回集合;

      C:递归结束条件,k=1时,将两个1存储到集合,并返回;

      D:递归规律,row = getRow(k-1);

      E:当最底层递归结束后,此时k=2,要存储第2行,然后回溯到k=3,存储第3行,直到k行全部存储完毕;

      F:返回集合对象;

2.2  代码实现

public List getRow(int rowIndex) {//创建对象List triangle = new ArrayList();List row = new ArrayList();//递归结束条件if(rowIndex == 0) {row.add(1);return row;}if(rowIndex == 1) {row.add(1);row.add(1);return row;}//开始递归row = getRow(rowIndex - 1);triangle.add(1);for(int j = 1; j < rowIndex; j++) {triangle.add(row.get(j-1)+row.get(j));}triangle.add(1);return triangle;}

2.3  复杂度分析

      A:时间复杂度为O(rowIndex);

      B:空间复杂度,有2个集合对象和递归,O(3rowIndex),待议待议;

三、数组法

3.1  思路分析

      A:创建一个集合对象row存储要返回的行数据;

      B:集合的第一个元素存入1;

      C:利用循环,外层循环从1到k,内层循环表示在当前行的条件下,要计算的次数;

      D:内循环结束后,集合的最后一个元素存入1,然后继续外循环;

      E:外循环结束后,返回集合;

3.2  代码实现

public List getRow(int rowIndex) {//创建集合对象List row = new ArrayList();//创建中间变量int pre = 1;//集合第一个元素置1row.add(1);//每次循环结果的结果对应第i行的数据//pre很好的利用了首尾都是1,每次循环结束后,因为遍历到temp=1,pre会置1;//每次循环开始时,pre=1,然后取第2个元素,把和覆盖第2个元素,然后更新pre为第2个元素覆盖之前的值;//一直更新到pre=1,也就加完了,最后添上1;for(int i = 1; i <= rowIndex; i++) {for(int j = 1; j < i; j++) {int temp = row.get(j);row.set(j,pre+row.get(j));pre = temp;}row.add(1);}return row;}

3.3  代码优化

//把数据从后往前存储
public List getRow(int rowIndex) {//创建集合对象List row = new ArrayList();//添加元素row.add(1);//开始循环for(int i = 1; i <= rowIndex; i++) {for(int j = i-1; j >0; j--) {row.set(j,row.get(j-1)+row.get(j));}row.add(1);}return row;}

3.4  复杂度分析

      A:时间复杂度为O(rowIndex^2);

      B:空间复杂度为O(rowIndex);

四、公式法

4.1  思路分析

4.2  代码实现

public List getRow(int rowIndex) {//创建集合对象List row = new ArrayList();for(int k = 0; k <= rowIndex; k++) {row.add(combination(rowIndex,k));}return row;}//求组合的值public int combination(int rowIndex,int k) {long res = 1;for(int i = 1; i <= k; i++) {res = res * (rowIndex-k+i) / i;}return (int)res;}

4.3  代码优化

       A:关于Cnk的求解,对公式进行化简;

public List getRow(int rowIndex) {List row = new ArrayList<>();int N = rowIndex;//pre用于更新Cn(k-1);//假设N=2,那么pre一开始为1,相当于C2(0),根据公式求出C2(1),加到集合里;//然后pre更新为C2(1),然后又利用公式求出C2(2),加到集合里,pre更新为C2(2),也就是重置为1;//此时集合里的元素是1 2 1;long pre = 1;row.add(1);//因为Cn(0)都为2,故k从1开始到Nfor (int k = 1; k <= N; k++) {long cur = pre * (N - k + 1) / k;row.add((int) cur);pre = cur;}return row;
}

4.4  复杂度分析

      A:时间复杂度为O(rowIndex);

      B:空间复杂度为O(rowIndex);

五、参考地址

      A:https://leetcode-cn.com/problems/pascals-triangle-ii/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by--28/


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部