<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刷題實戰(zhàn)464:我能贏嗎

          共 2422字,需瀏覽 5分鐘

           ·

          2021-12-14 01:11

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

          今天和大家聊的問題叫做?我能贏嗎,我們先來看題面:
          https://leetcode-cn.com/problems/can-i-win/

          In the "100 game" two players take turns adding, to a running total, any integer from 1 to 10. The player who first causes the running total to reach or exceed 100 wins.

          What if we change the game so that players cannot re-use integers?

          For example, two players might take turns drawing from a common pool of numbers from 1 to 15 without replacement until they reach a total >= 100.

          Given two integers maxChoosableInteger and desiredTotal, return true if the first player to move can force a win, otherwise, return false. Assume both players play optimally.

          在 "100 game" 這個游戲中,兩名玩家輪流選擇從 1 到 10 的任意整數(shù),累計整數(shù)和,先使得累計整數(shù)和達到或超過 100 的玩家,即為勝者。

          如果我們將游戲規(guī)則改為 “玩家不能重復使用整數(shù)” 呢?

          例如,兩個玩家可以輪流從公共整數(shù)池中抽取從 1 到 15 的整數(shù)(不放回),直到累計整數(shù)和 >= 100。

          給定一個整數(shù) maxChoosableInteger (整數(shù)池中可選擇的最大數(shù))和另一個整數(shù) desiredTotal(累計和),判斷先出手的玩家是否能穩(wěn)贏(假設兩位玩家游戲時都表現(xiàn)最佳)?

          你可以假設 maxChoosableInteger 不會大于 20, desiredTotal 不會大于 300。

          示例? ? ? ?

          ? ? ? ? ? ? ? ? ? ? ?

          輸入:
          maxChoosableInteger = 10
          desiredTotal = 11

          輸出:
          false

          解釋:
          無論第一個玩家選擇哪個整數(shù),他都會失敗。
          第一個玩家可以選擇從 1?到 10?的整數(shù)。
          如果第一個玩家選擇 1,那么第二個玩家只能選擇從 2?到 10?的整數(shù)。
          第二個玩家可以通過選擇整數(shù) 10(那么累積和為 11?>= desiredTotal),從而取得勝利.
          同樣地,第一個玩家選擇任意其他整數(shù),第二個玩家都會贏。


          解題

          https://www.cnblogs.com/grandyang/p/6103525.html

          這道題給了我們一堆數(shù)字,然后兩個人,每人每次選一個數(shù)字,看數(shù)字總數(shù)誰先到給定值,有點像之前那道 Nim Game,但是比那題難度大。我剛開始想肯定說用遞歸啊,結(jié)果寫完發(fā)現(xiàn) TLE 了,后來發(fā)現(xiàn)我們必須要優(yōu)化效率,使用 HashMap 來記錄已經(jīng)計算過的結(jié)果。我們首先來看如果給定的數(shù)字范圍大于等于目標值的話,直接返回 true。如果給定的數(shù)字總和小于目標值的話,說明誰也沒法贏,返回 false。然后我們進入遞歸函數(shù),首先我們查找當前情況是否在 HashMap 中存在,有的話直接返回即可。我們使用一個整型數(shù)按位來記錄數(shù)組中的某個數(shù)字是否使用過,我們遍歷所有數(shù)字,將該數(shù)字對應的 mask 算出來,如果其和 used 相與為0的話,說明該數(shù)字沒有使用過,我們看如果此時的目標值小于等于當前數(shù)字,說明已經(jīng)贏了,或者調(diào)用遞歸函數(shù),如果返回 false,說明也是第一個人贏了。為啥呢,因為當前已經(jīng)選過數(shù)字了,此時就該對第二個人調(diào)用遞歸函數(shù),只有返回的結(jié)果是 false,我們才能贏,所以此時我們 true,并返回 true。如果遍歷完所有數(shù)字,標記 false,并返回 false,參見代碼如下:


          class?Solution?{
          public:
          ????bool?canIWin(int?maxChoosableInteger, int?desiredTotal)?{
          ????????if?(maxChoosableInteger >= desiredTotal) return?true;
          ????????if?(maxChoosableInteger * (maxChoosableInteger + 1) / 2?< desiredTotal) return?false;
          ????????unordered_map<int, bool> m;
          ????????return?canWin(maxChoosableInteger, desiredTotal, 0, m);
          ????}
          ????bool?canWin(int?length, int?total, int?used, unordered_map<int, bool>& m)?{
          ????????if?(m.count(used)) return?m[used];
          ????????for?(int?i = 0; i < length; ++i) {
          ????????????int?cur = (1?<< i);
          ????????????if?((cur & used) == 0) {
          ????????????????if?(total <= i + 1?|| !canWin(length, total - (i + 1), cur | used, m)) {
          ????????????????????m[used] = true;
          ????????????????????return?true;
          ????????????????}
          ????????????}
          ????????}
          ????????m[used] = false;
          ????????return?false;
          ????}
          };


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

          上期推文:

          LeetCode1-460題匯總,希望對你有點幫助!

          LeetCode刷題實戰(zhàn)461:漢明距離

          LeetCode刷題實戰(zhàn)462:最少移動次數(shù)使數(shù)組元素相等 II

          LeetCode刷題實戰(zhàn)463:島嶼的周長


          瀏覽 81
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  麻豆视频一二区 | 亚洲V国产v欧美v久久久久久 | 成人三级视频在线观看 | 青娱乐cao| www.一起撸 |