首页 > 其他分享 >(nice!!!)(LeetCode) 1884. 鸡蛋掉落-两枚鸡蛋(动态规划 dfs递归和递推 || 数学)

(nice!!!)(LeetCode) 1884. 鸡蛋掉落-两枚鸡蛋(动态规划 dfs递归和递推 || 数学)

时间:2024-10-14 18:53:11浏览次数:18  
标签:return sta int 鸡蛋 mn twoEggDrop dfs 1884

题目:1884. 鸡蛋掉落-两枚鸡蛋

在这里插入图片描述
在这里插入图片描述

方法一:动态规划dp+递归dfs+记忆化搜索。时间复杂度0(n^2)。

C++版本:

class Solution {
public:
	//状态sta[i]表示:i层找到f所需要的最小操作次数
    int sta[1010];
    int twoEggDrop(int n) {
    	//层数为0时,直接返回0
        if(n==0) return 0;
        //遍历过
        if(sta[n]) return sta[n];
        //初始化最大值
        int mn=n;
        //遍历可以选中哪层楼
        for(int i=1;i<n;i++){
        	//如果在i层鸡蛋破碎了,那么我们只能从最低的层数开始往上。
        	//如果在i层鸡蛋完好,那f就在i+1~n层,这就类似于在1~n-i层之间寻找。
        	//这两种方案中选取最大需要的操作次数,再去和其他的i层进行比较。
            mn=min(mn,max(i,twoEggDrop(n-i)+1));
        }
        //记忆化
        return sta[n]=mn;
    }
};

JAVA版本:

class Solution {
	//状态sta[i]表示:i层找到f所需要的最小操作次数
    private static final int[] sta=new int[1010];
    public int twoEggDrop(int n) {
    	//层数为0时,直接返回0
        if(n==0) return 0;
        //遍历过
        if(sta[n]>0) return sta[n];
        //初始化最大值
        int mn=n;
        //遍历可以选中哪层楼
        for(int i=1;i<n;i++){
        	//如果在i层鸡蛋破碎了,那么我们只能从最低的层数开始往上。
        	//如果在i层鸡蛋完好,那f就在i+1~n层,这就类似于在1~n-i层之间寻找。
        	//这两种方案中选取最大需要的操作次数,再去和其他的i层进行比较。
            mn=Math.min(mn,Math.max(i,twoEggDrop(n-i)+1));
        }
        //记忆化
        return sta[n]=mn;
    }
}

方法二:动态规划dp+递推。时间复杂度为0(n^2)。
C++版本:

class Solution {
public:
    int twoEggDrop(int n) {
		//状态f[i]表示:i层找到f所需要的最小操作次数
        vector<int> f(n+1,0);
        for(int i=1;i<=n;i++){
        	//初始化最大值
            f[i]=i;
        	//遍历可以选中哪层楼
            for(int j=1;j<i;j++){
	        	//如果在j层鸡蛋破碎了,那么我们只能从最低的层数开始往上。
	        	//如果在j层鸡蛋完好,那f就在j+1~n层,这就类似于在1~n-j层之间寻找。
	        	//这两种方案中选取最大需要的操作次数,再去和其他的j层进行比较。
                f[i]=min(f[i],max(j,f[i-j]+1));
            }
        }
        return f[n];
    }
};

JAVA版本:

class Solution {
    private static final int[] f=new int[1010];
    public int twoEggDrop(int n) {
        for(int i=1;i<=n;i++){
            f[i]=i;
            for(int j=1;j<i;j++){
                f[i]=Math.min(f[i],Math.max(j,f[i-j]+1));
            }
        }
        return f[n];
    }
}

方法三:数学推导。

假设有x次操作次数,求n最大可以是多少。
第一次选最多只能选第x层:如果碎了,就可以从1开始往上。
如果没碎,第二次选最多只能选第x-1层:如果碎了,就可以从x+1开始往上。

直到最后最多只能选第1层:如果碎了,下一层就是答案;没碎,当前就是答案。

x+(x-1)+…+1>=n,即x^2+x-2n>=0。解方程,答案就是(sqrt(8n+1)-1)/2

C++版本:

class Solution {
public:
    int twoEggDrop(int n) {
        return ceil((sqrt(8*n+1)-1)/2);
    }
};

JAVA版本:

class Solution {
    public int twoEggDrop(int n) {
        return (int)Math.ceil((Math.sqrt(8*n)-1)/2);
    }
}

标签:return,sta,int,鸡蛋,mn,twoEggDrop,dfs,1884
From: https://blog.csdn.net/weixin_46028214/article/details/142925141

相关文章

  • hdfs小文件分析
    导出namenode的元数据文件,并将数据转成csv格式,逗号分割字段hdfsdfsadmin-fetchImage ./#将文件拉到本地hdfsoiv-ifsimage_0000000000243832876-ofsimage.csv-pDelimited -delimiter","  -Xmx30720m  #使用hdfs工具本地解析文件,我的镜像是30G,我就用了30的堆......
  • Spark的前瞻--- 数据处理方式,HDFS读写流程,MR计算原理,YRAN资源调度原理,分布式计算
    目录一,数据处理的方式1,单机数据处理2,集群数据储存1,HDFS的读写流程 4,分布式资源调度YRAN1,YRAN原理图二,分布式计算框架1,MapReduce分布式计算2,Spark分布式计算spark的部署方式1,spark资源调度yran模式三,Spark的开发方式1,交互式开发2,脚本式开发......
  • 自定义DFS,DFT,DTFT函数并比较关系
    一、DFS(离散傅里叶级数)functiony=DFS(x,L)N=length(x);xi=[x;zeros(L-N,1)]; y=zeros(1,L);fork=1:Lsum=0; forn=1:Lsum=sum+xi(n)*exp(-2j*pi*k*n/L); end y(k)=sum; end end 二、DFT(离散傅里叶变换) functiony=DFT(x,L)N......
  • 数据结构课程设计大项目————迷宫问题(邻接矩阵,prim生成算法,DFS寻路,BFS寻路,路径回溯
    一.前言迷宫问题是数据结构中最值得实践的大项目之一,本文主要讲解思路,提供的代码大部分都有注释(没有的就是太多了懒得写了QAQ)。为了更好的表现效果,该程序使用了easyx可视化,easyx简单易学(大概一天到两天就可以学会),上手简单。该程序由c语言实现,本人水平有限程序可优化空间很大。......
  • 基于zookeeper安装部署下,配置 HDFS-HA 自动故障转移
    (1)访问 hdfs-site.xml:vi/erport/ha/hadoop/etc/hadoop/hdfs-site.xml在hdfs-site.xml中增加:<!--开启失败故障自动转移--><property><name>dfs.ha.automatic-failover.enabled</name><value>true</value></propert......