leet刷题之(杨辉三角、阶乘问题)

个人笔记博客:java的笔记
题目一描述:
给定一个整数,求出n行杨辉三角的前n排的数,
百度图片
例如:

输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]

题目链接
题目一分析:
之前有一个使用递归求解杨辉三角的做法,每一行的第一个元素和最后一个元素是1,其余元素是其肩膀上元素的和,每行有K个元素。因此求当前元素时先求得上一行元素。
代码如下:

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        if(numRows==0)return res;
        //外部循环表示当前的元素为第i行
        for(int i=1;i<=numRows;i++){
            List<Integer> list = new ArrayList();
            //内部循环表示当前第i行的第j个元素
            for(int j=1;j<=i;j++){
                if(j==1||j==i) list.add(1);
                else{
                //取上一行的当前元素头顶的元素
                    int sum = res.get(i-2).get(j-2)+res.get(i-2).get(j-1);
                    list.add(sum);
                }
            }
            res.add(list);
        }
        return res;
    }
}

题目二描述:
杨辉三角求第k行元素

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

题目二分析:
求第k行元素,本想使用递归函数进行,测试时出现了超时,因此找到了杨辉三角计算一行的数学公式,效果并不是很好,使用上面的方法进行计算所有行的元素,把最后一行返回即可,这种方式出现关于阶乘的问题在一下进行讨论。
百度杨辉三角公式
代码如下:

import java.math.BigInteger;
class Solution {
   public List<Integer> getRow(int rowIndex) {
		List<Integer> res = new ArrayList<>();
		if (rowIndex == 0 || rowIndex == 1) {
			res.add(1);
			if (rowIndex == 1)
				res.add(1);
			return res;
		}
		for (int i = 0; i <= rowIndex; i++) {
			if (i == 0 || i == rowIndex)
				res.add(1);
			else {
				Integer sum = Integer.valueOf(
						String.valueOf(jiecheng4(rowIndex).divide(jiecheng4(i).multiply(jiecheng4(rowIndex - i)))));
				res.add(sum);
			}
		}
		return res;
	}

	// 计算阶乘,BigInteger类型,杨辉三角每一行元素的值为K次多项式的饮食分解
	public  BigInteger jiecheng4(int n) {
		if (n == 1)
			return BigInteger.valueOf(1);
		else
			return jiecheng4(n - 1).multiply(BigInteger.valueOf(n));
	}
}

阶乘计算:
根据int类型计算阶乘:

// 最多计算到13的阶乘
	public static int jiecheng(int n) {
		if (n == 1)
			return 1;
		else
			return n * jiecheng(n - 1);
	}

由于int类型是4字节长度,因此计算范围有限
根据long类型计算阶乘:

	// 最多计算到20的阶乘
	public static long jiecheng2(int n) {
		if (n == 1)
			return 1l;
		else
			return n * jiecheng2(n - 1);
	}

使用BigInteger进行计算阶乘

public static BigInteger jiecheng3(int n) {
		if (n == 1)
			return BigInteger.valueOf(1);
		else
			return jiecheng3(n - 1).multiply(BigInteger.valueOf(n));
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
探险家小扣的行动轨迹,都将保存在记录仪中。expeditions[i] 表示小扣第 i 次探险记录,用一个字符串数组表示。其中的每个「营地」由大小写字母组成,通过子串 -> 连接。例:"Leet->code->Campsite",表示到访了 "Leet"、"code"、"Campsite" 三个营地。expeditions[0] 包含了初始小扣已知的所有营地;对于之后的第 i 次探险(即 expeditions[i] 且 i > 0),如果记录中包含了之前均没出现的营地,则表示小扣 新发现 的营地。 请你找出小扣发现新营地最多且索引最小的那次探险,并返回对应的记录索引。如果所有探险记录都没有发现新的营地,返回 -1。注意: 大小写不同的营地视为不同的营地; 营地的名称长度均大于 0。用python实现。给你几个例子:示例 1: 输入:expeditions = ["leet->code","leet->code->Campsite->Leet","leet->code->leet->courier"] 输出:1 解释: 初始已知的所有营地为 "leet" 和 "code" 第 1 次,到访了 "leet"、"code"、"Campsite"、"Leet",新发现营地 2 处:"Campsite"、"Leet" 第 2 次,到访了 "leet"、"code"、"courier",新发现营地 1 处:"courier" 第 1 次探险发现的新营地数量最多,因此返回 1。示例 2: 输入:expeditions = ["Alice->Dex","","Dex"] 输出:-1 解释: 初始已知的所有营地为 "Alice" 和 "Dex" 第 1 次,未到访任何营地; 第 2 次,到访了 "Dex",未新发现营地; 因为两次探险均未发现新的营地,返回 -1
最新发布
04-23

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值