[Leetcode] 每日两题 1884 1446 -day27

本文详细介绍了LeetCode的两道算法题,分别是1884. 鸡蛋掉落问题,通过动态规划探讨了拥有两枚鸡蛋时如何确定摔碎鸡蛋的楼层,以及1446. 连续字符问题,提出了解决方案并强调了节省空间的方法。
摘要由CSDN通过智能技术生成
1884. 鸡蛋掉落-两枚鸡蛋

请添加图片描述

DP , 从最简单的case开始 假如只有一个鸡蛋 那在 0 -n 楼种 要测试出那一楼 最坏情况就是n次 因为得一个一个试

那么有两个鸡蛋呢 , 可以先 用一个鸡蛋在 0-n 楼的某一楼 j 种试一下, 那如果破了 就只剩一个鸡蛋了 情况就变成 在 j楼 只有一个鸡蛋 ;那如果没破呢 那就把范围缩小到 n-j 这个范围内,而且有两个鸡蛋

然后就可以根据上述写出dp表达式

 dp[0][i] = min(dp[0][i],max(dp[1][j-1]+1,dp[0][i-j]+1))

dp[0]表示碎了 0颗鸡蛋

class Solution:
    def twoEggDrop(self, n: int) -> int:
        dp=[[1000]*(n+1) for _ in range(2)]
        for i in range(n+1):
                dp[1][i] = i 
        dp[0][1] = 1
        dp[0][0]= 0
        for i in range(n+1):
            for j in range(i):
                dp[0][i] = min(dp[0][i],max(dp[1][j-1]+1,dp[0][i-j]+1))
        return dp[0][n]  

参考大佬的数学递推式

大致的想法就是要找到让公式1 + 2 + 3 + 4 + … + x >= n成立的最小的x就是最后找到f的最小次数。所以也就是首项为1, 公差为1的等差数列的求和公式(x * (x + 1) / 2) >= n,然后解方程,求出x。

 class Solution:
    def twoEggDrop(self, n: int) -> int:
    	return math.ceil( ((1+8*n)**0.5 - 1)/2 )
1446. 连续字符

请添加图片描述

记录每个点当前最大值,okk 其实也可以只记录前一个 和全局最大 节省空间

class Solution:
    def maxPower(self, s: str) -> int:
        dp=[1]*len(s)
        for i in range(1,len(s)):
            if s[i]==s[i-1]:
                dp[i]=dp[i-1]+1
        return max(dp)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值