<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實(shí)戰(zhàn)375:猜數(shù)字大小 II

          共 5009字,需瀏覽 11分鐘

           ·

          2021-09-13 16:06

          算法的重要性,我就不多說(shuō)了吧,想去大廠(chǎng),就必須要經(jīng)過(guò)基礎(chǔ)知識(shí)和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號(hào)后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問(wèn)題叫做 猜數(shù)字大小 II,我們先來(lái)看題面:
          https://leetcode-cn.com/problems/guess-number-higher-or-lower-ii/

          We are playing the Guessing Game. The game will work as follows:
          I pick a number between 1 and n.
          You guess a number.
          If you guess the right number, you win the game.
          If you guess the wrong number, then I will tell you whether the number I picked is higher or lower, and you will continue guessing.
          Every time you guess a wrong number x, you will pay x dollars. If you run out of money, you lose the game.
          Given a particular n, return the minimum amount of money you need to guarantee a win regardless of what number I pick.

          我們正在玩一個(gè)猜數(shù)游戲,游戲規(guī)則如下:
          我從 1 到 n 之間選擇一個(gè)數(shù)字,你來(lái)猜我選了哪個(gè)數(shù)字。
          每次你猜錯(cuò)了,我都會(huì)告訴你,我選的數(shù)字比你的大了或者小了。
          然而,當(dāng)你猜了數(shù)字 x 并且猜錯(cuò)了的時(shí)候,你需要支付金額為 x 的現(xiàn)金。直到你猜到我選的數(shù)字,你才算贏(yíng)得了這個(gè)游戲。

          示例


          n = 10, 我選擇了8.

          第一輪: 你猜我選擇的數(shù)字是5,我會(huì)告訴你,我的數(shù)字更大一些,然后你需要支付5塊。
          第二輪: 你猜是7,我告訴你,我的數(shù)字更大一些,你支付7塊。
          第三輪: 你猜是9,我告訴你,我的數(shù)字更小一些,你支付9塊。

          游戲結(jié)束。8 就是我選的數(shù)字。

          你最終要支付 5 + 7 + 9 = 21 塊錢(qián)。
          給定 n ≥ 1,計(jì)算你至少需要擁有多少現(xiàn)金才能確保你能贏(yíng)得這個(gè)游戲。


          解題

          https://blog.csdn.net/abc15766228491/article/details/82931660


          具體思路,經(jīng)典的動(dòng)態(tài)規(guī)劃問(wèn)題:

          1、設(shè)置dp[len][i] 表示的意思是,長(zhǎng)度是len的數(shù)字段,以下標(biāo)為i開(kāi)頭的最佳解(最小花費(fèi)值)。首先初始化前兩行dp[0][i]和dp[1][0]為0,意思為,長(zhǎng)度為0和1的數(shù)字段的花費(fèi)都為0,初始化dp[2][i]為dp[2][i]=a[i]表示,以下標(biāo)i開(kāi)頭,長(zhǎng)度為2的段,最佳解為a[i](比如,(2,3)這個(gè)段的最佳值為2)。

          2、設(shè)置dp[len][i]:遍歷以i開(kāi)頭,長(zhǎng)度為len的所有數(shù)字,以每一個(gè)數(shù)字的位置作為切分點(diǎn),切分這個(gè)段為左右兩個(gè)部分,比較左右兩個(gè)部分的值,取最大值保存,遍歷所有數(shù)字,得到所有的切分點(diǎn)下的最大值,取最小值,這個(gè)值就是dp[len][i]的值,即:部分取最大,全局取最小。動(dòng)態(tài)歸化方程:
          dp[len][i] = min( splitResult(j) ) (0<=j<=len);splitResult(j) = max(dp[t][i], dp[len-t-1][j+i+1])+a[j+i] (0<=t<len);
          這里j+i是遍歷小數(shù)字段時(shí)候的切分點(diǎn)

          因此,用三重循環(huán)就可以了,最后一行dp[n]只有一個(gè)值,就是從dp[n][0],意思就是說(shuō)從0開(kāi)始長(zhǎng)度為n的數(shù)據(jù)段的最優(yōu)解,返回就行。


          class Solution {
          public:
              int getMoneyAmount(int n) {
                  vector<vector<int> >dp(n+1, vector<int>(n+1, 0));
                  vector<int> a;
                  for (int i = 0; i < n; ++i) {
                      a.push_back(i+1);
                  }
                  for (int i = 0; i < n-1; ++i) {
                     dp[2][i]=a[i];
                  }
                  for (int len = 3; len <= n; ++len) {
                      //開(kāi)始求dp[3][i]
                      for (int i = 0; i <= n-len; ++i) {
                          //對(duì)于每個(gè)dp[3][i]都要遍歷每個(gè)值,進(jìn)行且分,找到且分點(diǎn)的cost最小的值為dp[3][i]的值
                          int global=0;
                          for (int j = 0; j < len; ++j) {
                              //對(duì)于每次切分之后的兩個(gè)部分,取最大值,j是長(zhǎng)度,從下標(biāo)偏移位置為j的地方切分,左邊長(zhǎng)度為j,右邊長(zhǎng)度為len-j-1
                              //左邊開(kāi)始的值為i,右邊開(kāi)始的值為j+i+1,切分點(diǎn)為j+i
                              int tmp = max(dp[j][i], dp[len-j-1][j+i+1])+a[j+i];
                              //部分最大,整體最小
                              if(j==0) global = tmp;
                              else global = min(global, tmp);
                          }
                          dp[len][i] = global;
                      }
                  }
              
                  return dp[n][0];
              }
          };


          好了,今天的文章就到這里,如果覺(jué)得有所收獲,請(qǐng)順手點(diǎn)個(gè)在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動(dòng)力 。

          上期推文:

          LeetCode1-360題匯總,希望對(duì)你有點(diǎn)幫助!

          LeetCode刷題實(shí)戰(zhàn)361:轟炸敵人

          LeetCode刷題實(shí)戰(zhàn)362:敲擊計(jì)數(shù)器

          LeetCode刷題實(shí)戰(zhàn)363:矩形區(qū)域不超過(guò) K 的最大數(shù)值和
          LeetCode刷題實(shí)戰(zhàn)364:加權(quán)嵌套序列和 II
          LeetCode刷題實(shí)戰(zhàn)365:水壺問(wèn)題
          LeetCode刷題實(shí)戰(zhàn)366:尋找二叉樹(shù)的葉子節(jié)點(diǎn)
          LeetCode刷題實(shí)戰(zhàn)367:有效的完全平方數(shù)
          LeetCode刷題實(shí)戰(zhàn)368:最大整除子集數(shù)
          LeetCode刷題實(shí)戰(zhàn)369:給單鏈表加一
          LeetCode刷題實(shí)戰(zhàn)370:區(qū)間加法
          LeetCode刷題實(shí)戰(zhàn)371:兩整數(shù)之和
          LeetCode刷題實(shí)戰(zhàn)372:超級(jí)次方
          LeetCode刷題實(shí)戰(zhàn)373:查找和最小的K對(duì)數(shù)字

          瀏覽 67
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91成人亚洲 | 免费亲子乱婬一级A片 | 熟女人妻一区二区三区免费看 | 婷婷五月色 | 亚洲A片一区二区三区电影网 |