日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

887. 鸡蛋掉落

發(fā)布時(shí)間:2023/11/29 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 887. 鸡蛋掉落 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

887. 雞蛋掉落

給你 k 枚相同的雞蛋,并可以使用一棟從第 1 層到第 n 層共有 n 層樓的建筑。

已知存在樓層 f ,滿足 0 <= f <= n ,任何從 高于 f 的樓層落下的雞蛋都會(huì)碎,從 f 樓層或比它低的樓層落下的雞蛋都不會(huì)破。

每次操作,你可以取一枚沒(méi)有碎的雞蛋并把它從任一樓層 x 扔下(滿足 1 <= x <= n)。如果雞蛋碎了,你就不能再次使用它。如果某枚雞蛋扔下后沒(méi)有摔碎,則可以在之后的操作中 重復(fù)使用 這枚雞蛋。

請(qǐng)你計(jì)算并返回要確定 f 確切的值 的 最小操作次數(shù) 是多少?

示例 1:輸入:k = 1, n = 2 輸出:2 解釋: 雞蛋從 1 樓掉落。如果它碎了,肯定能得出 f = 0 。 否則,雞蛋從 2 樓掉落。如果它碎了,肯定能得出 f = 1 。 如果它沒(méi)碎,那么肯定能得出 f = 2 。 因此,在最壞的情況下我們需要移動(dòng) 2 次以確定 f 是多少。 示例 2:輸入:k = 2, n = 6 輸出:3 示例 3:輸入:k = 3, n = 14 輸出:4

解題思路

使用dp+二分

  • n*100+k 編號(hào)每一種n和k的情況。
  • 狀態(tài)轉(zhuǎn)移方程為:當(dāng)x為不同樓層時(shí),dp[k][n]=1+max(dp[k-1][x-1],dp[k][n-x]),在雞蛋在樓層x摔壞以后排查下面x-1層和雞蛋沒(méi)有摔壞向上排查n-x層取最壞情況的操作次數(shù)
  • 我們發(fā)現(xiàn)當(dāng)x遞增的時(shí)候,操作次數(shù)也會(huì)不斷減少,因此 dp[k-1][x-1],dp[k][n-x]是具有相反的單調(diào)性的,而我們又必須取二者最壞情況,所以我們可以二分查找x,盡量找出dp[k-1][x-1],dp[k][n-x]最接近的x,就是可取地的最小操作次數(shù)
  • 代碼

    class Solution {Map<Integer,Integer> map=new HashMap<>();public int superEggDrop(int k, int n) {int cur=n*100+k;if(n==0)return 0;if(k==1)return n;if(map.containsKey(cur))return map.get(cur);int l=1,r=n,res=Integer.MAX_VALUE;while(l<=r){int mid=(r-l)/2+l;int lv=superEggDrop(k-1,mid-1),rv=superEggDrop(k,n-mid);if(lv>rv){r=mid-1;res=Math.min(1+lv,res);}else {l=mid+1;res=Math.min(1+rv,res);}}map.put(cur,res);return map.get(cur);} }

    總結(jié)

    以上是生活随笔為你收集整理的887. 鸡蛋掉落的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。