1. ?LeetCode刷題實(shí)戰(zhàn)294:翻轉(zhuǎn)游戲II

        共 2472字,需瀏覽 5分鐘

         ·

        2021-06-17 20:51

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

        今天和大家聊的問題叫做 翻轉(zhuǎn)游戲II,我們先來看題面:
        https://leetcode-cn.com/problems/flip-game-ii/
        You are playing the following Flip Game with your friend: Given a string that contains only these two characters: + and -, you and your friend take turns to flip two consecutive "++" into "--". The game ends when a person can no longer make a move and therefore the other person will be the winner.
        Write a function to determine if the starting player can guarantee a win.


        你和朋友玩一個(gè)叫做「翻轉(zhuǎn)游戲」的游戲,游戲規(guī)則:給定一個(gè)只有 + 和 - 的字符串。你和朋友輪流將 連續(xù) 的兩個(gè) "++" 反轉(zhuǎn)成 "--"。當(dāng)一方無法進(jìn)行有效的翻轉(zhuǎn)時(shí)便意味著游戲結(jié)束,則另一方獲勝。

        請(qǐng)你寫出一個(gè)函數(shù)來判定起始玩家是否存在必勝的方案。


        示例


        輸入: s = "++++"
        輸出: true
        解析: 起始玩家可將中間的 "++" 翻轉(zhuǎn)變?yōu)?"+--+" 從而得勝。
        延伸:
        請(qǐng)推導(dǎo)你算法的時(shí)間復(fù)雜度。

        解題

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

        這道題是之前那道 Flip Game 的拓展,讓我們判斷先手的玩家是否能贏,可以窮舉所有的情況,用回溯法來解題,思路跟上面那題類似,也是從第二個(gè)字母開始遍歷整個(gè)字符串,如果當(dāng)前字母和之前那個(gè)字母都是+,那么遞歸調(diào)用將這兩個(gè)位置變?yōu)?-的字符串,如果返回 false,說明當(dāng)前玩家可以贏,結(jié)束循環(huán)返回 false。

        這里同時(shí)貼上熱心網(wǎng)友 iffalse 的解釋,這道題不是問 “1p是否會(huì)怎么選都會(huì)贏”,而是 “如果1p每次都選特別的兩個(gè)+,最終他會(huì)不會(huì)贏”。所以 canWin 這個(gè)函數(shù)的意思是 “在當(dāng)前這種狀態(tài)下,至少有一種選法,能夠讓他贏”。而 (!canWin) 的意思就變成了 “在當(dāng)前這種狀態(tài)下,無論怎么選,都不能贏”。

        所以 1p 要看的是,是否存在這樣一種情況,無論 2p 怎么選,都不會(huì)贏。所以只要有一個(gè) (!canWin),1p 就可以確定他會(huì)贏。這道題從博弈論的角度會(huì)更好理解。每個(gè) player 都想讓自己贏,所以每輪他們不會(huì)隨機(jī)選+。每一輪的 player 會(huì)選能夠讓對(duì)手輸?shù)?。如果無論如何都選不到讓對(duì)手輸?shù)?,那么只能是當(dāng)前的 player 輸了,參見代碼如下:


        class Solution {
        public:
            bool canWin(string s) {
                for (int i = 1; i < s.size(); ++i) {
                    if (s[i] == '+' && s[i - 1] == '+' && !canWin(s.substr(0, i - 1) + "--" + s.substr(i + 1))) {
                        return true;
                    }
                }
                return false;
            }
        };


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

        上期推文:

        LeetCode1-280題匯總,希望對(duì)你有點(diǎn)幫助!
        LeetCode刷題實(shí)戰(zhàn)281:鋸齒迭代器
        LeetCode刷題實(shí)戰(zhàn)282:給表達(dá)式添加運(yùn)算符
        LeetCode刷題實(shí)戰(zhàn)283:移動(dòng)零
        LeetCode刷題實(shí)戰(zhàn)284:頂端迭代器
        LeetCode刷題實(shí)戰(zhàn)285:二叉搜索樹中的順序后繼
        LeetCode刷題實(shí)戰(zhàn)286:墻和門
        LeetCode刷題實(shí)戰(zhàn)287:尋找重復(fù)數(shù)
        LeetCode刷題實(shí)戰(zhàn)288:?jiǎn)卧~的唯一縮寫
        LeetCode刷題實(shí)戰(zhàn)289:生命游戲
        LeetCode刷題實(shí)戰(zhàn)290:?jiǎn)卧~規(guī)律


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

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 男人日女人的b | 91超碰在线 | 精品人妻无码视频 | 日本高清久久 | 免费操屄网 |