杨辉三角 II2021116

题目

杨辉三角 II

给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
杨辉三角
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:

输入: 3
输出: [1,3,3,1]

进阶:

  • 你可以优化你的算法到 O(k) 空间复杂度吗?

解法1

分析

主要思路:借助前一篇的思路,只不过res集合并不会存储下来,而是把当前cur集合赋值给res,供下次使用。

代码 1ms 36.6MB

public List<Integer> getRow(int rowIndex) {
    List<Integer> res = new ArrayList<>();
	List<Integer> cur = new ArrayList<>();
	for (int i = 0; i <= rowIndex; i++) {
		cur = new ArrayList<>();
		for (int j = 0; j <= i; j++) {
			if (j == 0 || j == i) {
				cur.add(1);
			} else {
				cur.add(res.get(j-1)+res.get(j));
			}
		}
		res = cur;
	}
	return cur;
}

解法2

分析

主要思路:相比于解法1更加优化,去掉中间res集合,直接在cur集合上操作;在第二层循环,采用倒叙遍历是为了避免当前对j位置的改变影响到后一次(j+1)值的计算;因为j位置的值取决于(j-1)和j的值,倒叙会先修改j的值,然后修改(j-1)的值。

代码 1ms 36MB

public List<Integer> getRow(int rowIndex) {
	List<Integer> cur = new ArrayList<>();
	cur.add(1);
	for (int i = 1; i <= rowIndex; i++) {
		for (int j = i-1; j > 0; j--) {
			cur.set(j, cur.get(j)+cur.get(j-1));
		}
		cur.add(1);
	}
	return cur;
}

解法3:二项式定理

分析

主要思路:前面两种解法共同的特点是依据上层集合;本解法是直接计算需要返回集合中的每个值,普通人很难想到;这里有一个隐含的知识点:杨辉三角的值是(1+x)^n的二项展开式的系数。另外,需要声明为long类型,因为计算过程中会有小数点,long精度可以避免抹掉小数点导致错误。

代码 0ms 35.8MB

public List<Integer> getRow(int rowIndex) {
	List<Integer> res = new ArrayList<>();
	long cur=1;
	for (int i = 1; i <= rowIndex; i++) {
		res.add((int)cur);
		cur = cur * (rowIndex-i+1)/i;
	}
	res.add((int)cur);
	return res;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值