智力題

我能贏嗎

輸入:
maxChoosableInteger = 10
desiredTotal = 11
輸出:
false
思路:我們首先來看如果給定的數(shù)字范圍大于等于目標(biāo)值的話,直接返回true。如果給定的數(shù)字總和小于目標(biāo)值的話试溯,說明誰也沒法贏爪瓜,返回false传于。然后我們進(jìn)入遞歸函數(shù)盗忱,首先我們查找當(dāng)前情況是否在哈希表中存在格郁,有的話直接返回即可展箱。我們使用一個(gè)整型數(shù)按位來記錄數(shù)組中的某個(gè)數(shù)字是否使用過旨枯,我們遍歷所有數(shù)字,將該數(shù)字對(duì)應(yīng)的mask算出來混驰,如果其和used相與為0的話攀隔,說明該數(shù)字沒有使用過皂贩,我們看如果此時(shí)的目標(biāo)值小于等于當(dāng)前數(shù)字,說明已經(jīng)贏了昆汹,或者我們調(diào)用遞歸函數(shù)明刷,如果返回false,說明也是第一個(gè)人贏了满粗。為啥呢辈末,因?yàn)楫?dāng)前我們已經(jīng)選過數(shù)字了,此時(shí)就該對(duì)第二個(gè)人調(diào)用遞歸函數(shù)映皆,只有他的結(jié)果是false挤聘,我們才能贏,所以此時(shí)我們標(biāo)記true捅彻,返回true组去。如果遍歷完所有數(shù)字,我們標(biāo)記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);   //表示將1左移i位添怔,1,2,4,8...
            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;
    }
};

猜數(shù)字大小(https://leetcode-cn.com/problems/guess-number-higher-or-lower-ii/)

從1-n中選一個(gè)數(shù),n = 10, 我選擇了8.
第一輪: 你猜我選擇的數(shù)字是5贤旷,我會(huì)告訴你广料,我的數(shù)字更大一些,然后你需要支付5塊幼驶。
第二輪: 你猜是7艾杏,我告訴你,我的數(shù)字更大一些盅藻,你支付7塊购桑。
第三輪: 你猜是9,我告訴你氏淑,我的數(shù)字更小一些勃蜘,你支付9塊。
游戲結(jié)束假残。8 就是我選的數(shù)字缭贡。
你最終要支付 5 + 7 + 9 = 21 塊錢。
給定 n ≥ 1辉懒,計(jì)算你至少需要擁有多少現(xiàn)金才能確保你能贏得這個(gè)游戲阳惹。
思路
dp[i][j]表示從[i,j]中猜出正確數(shù)字所需要的最少花費(fèi)金額.(dp[i][i] = 0)
假設(shè)在范圍[i,j]中選擇x, 則選擇x的最少花費(fèi)金額為: max(dp[i][x-1], dp[x+1][j]) + x
用max的原因是我們要計(jì)算最壞反饋情況下的最少花費(fèi)金額(選了x之后, 正確數(shù)字落在花費(fèi)更高的那側(cè))

    初始化為(n+2)*(n+2)數(shù)組的原因: 處理邊界情況更加容易, 例如對(duì)于求解dp[1][n]時(shí)x如果等于1, 需要考慮dp[0][1](0不可能出現(xiàn), dp[0][n]為0)
    而當(dāng)x等于n時(shí), 需要考慮dp[n+1][n+1](n+1也不可能出現(xiàn), dp[n+1][n+1]為0)
    
    如何寫出相應(yīng)的代碼更新dp矩陣, 遞推式dp[i][j] = max(max(dp[i][x-1], dp[x+1][j]) + x), x~[i:j], 可以畫出矩陣圖協(xié)助理解, 可以發(fā)現(xiàn)
    dp[i][x-1]始終在dp[i][j]的左部, dp[x+1][j]始終在dp[i][j]的下部, 所以更新dp矩陣時(shí)i的次序應(yīng)當(dāng)遵循bottom到top的規(guī)則, j則相反, 由于
    i肯定小于等于j, 所以我們只需要遍歷更新矩陣的一半即可(下半矩陣)
  public int getMoneyAmount(int n) {
        int[][] dp = new int[n+2][n+2];
        for(int i = n; i >= 1; --i) {
            for(int j = i; j <= n; ++j) {
                if(i == j)
                    dp[i][j] = 0;
                else {
                    dp[i][j] = Integer.MAX_VALUE;
                    for(int x = i; x <= j; ++x) 
                        dp[i][j] = Math.min(dp[i][j], Math.max(dp[i][x-1], dp[x+1][j]) + x);   //為什么這個(gè)地方最外面是Math.min???
                }
            }
        }
        return dp[1][n];
    }

nim游戲

你和你的朋友,兩個(gè)人一起玩 Nim 游戲:桌子上有一堆石頭眶俩,每次你們輪流拿掉 1 - 3 塊石頭莹汤。 拿掉最后一塊石頭的人就是獲勝者。你作為先手颠印。
你們是聰明人纲岭,每一步都是最優(yōu)解抹竹。 編寫一個(gè)函數(shù),來判斷你是否可以在給定石頭數(shù)量的情況下贏得游戲荒勇。

示例:
輸入: 4
輸出: false
解釋: 如果堆中有 4 塊石頭柒莉,那么你永遠(yuǎn)不會(huì)贏得比賽;
因?yàn)闊o論你拿走 1 塊沽翔、2 塊 還是 3 塊石頭兢孝,最后一塊石頭總是會(huì)被你的朋友拿走。

  bool canWinNim(int n) {
        return n%4==0?false:true;
    }

變態(tài)跳臺(tái)階

一只青蛙一次可以跳上1級(jí)臺(tái)階仅偎,也可以跳上2級(jí)……它也可以跳上n級(jí)跨蟹。求該青蛙跳上一個(gè)n級(jí)的臺(tái)階總共有多少種跳法。

f(1)=1, f(2)=2, f(3)=4, f(4)=8 設(shè)n+1級(jí)f(n+1),有
f(n+1) = f(1) + f(2) + ... + f(n)
f(n+2) = f(1) + f(2) + ... + f(n+1)
f(n+2)= 2f(1) + 2f(2) + ... + 2f(n)
故得f(n+2) = 2f(n+1)

矩形覆蓋

我們可以用 2 * 1 的小矩形橫著或者豎著去覆蓋更大的矩形橘沥。請(qǐng)問用n個(gè)2 * 1的小矩形無重疊地覆蓋一個(gè)2*n的大矩形窗轩,總共有多少種方法?
f(1) = 1
f(2) = 2
f(n) = f(n-1) + f(n-2)

孩子們的游戲

有n個(gè)數(shù)座咆,從0開始編號(hào)痢艺,每次刪除第m個(gè)數(shù),下一輪循環(huán)從m+1開始介陶。求最后剩下的數(shù)字是多少
雖然有遞推公式堤舒,但是用鏈表模擬更好

public int LastRemaining_Solution(int n, int m) {
        LinkedList<Integer> list = new LinkedList<>();
        for(int i=0;i<n;i++)
            list.add(i);
        int a = 0;
        while(list.size() > 1)
        {
            a = (a+m-1) % list.size();
            list.remove(a);//每次刪除,直到留下最后的那一個(gè)哺呜!
        }
        if(list.size() == 1)
            return list.get(0);//數(shù)組只剩下最后的一個(gè)
        return -1;
    }

n舌缤!末尾有多少個(gè)0

思路:5!=54321某残,0的個(gè)數(shù)和5的個(gè)數(shù)相等0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末国撵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子玻墅,更是在濱河造成了極大的恐慌介牙,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澳厢,死亡現(xiàn)場離奇詭異耻瑟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)赏酥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谆构,“玉大人裸扶,你說我怎么就攤上這事“崴兀” “怎么了呵晨?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵魏保,是天一觀的道長。 經(jīng)常有香客問我摸屠,道長谓罗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任季二,我火速辦了婚禮檩咱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胯舷。我一直安慰自己刻蚯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布桑嘶。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坷澡。 梳的紋絲不亂的頭發(fā)上甲捏,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音以政,去河邊找鬼霸褒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛妙蔗,可吹牛的內(nèi)容都是我干的傲霸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼眉反,長吁一口氣:“原來是場噩夢啊……” “哼昙啄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起寸五,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤梳凛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后梳杏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體韧拒,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年十性,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叛溢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡劲适,死狀恐怖楷掉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情霞势,我是刑警寧澤烹植,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布斑鸦,位于F島的核電站,受9級(jí)特大地震影響草雕,放射性物質(zhì)發(fā)生泄漏巷屿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一墩虹、第九天 我趴在偏房一處隱蔽的房頂上張望嘱巾。 院中可真熱鬧,春花似錦败晴、人聲如沸浓冒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稳懒。三九已至,卻和暖如春慢味,著一層夾襖步出監(jiān)牢的瞬間场梆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國打工纯路, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留或油,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓驰唬,卻偏偏與公主長得像顶岸,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叫编,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1出現(xiàn)的次數(shù) 輸入一個(gè)整數(shù)n搓逾,求從1到n這n個(gè)整數(shù)的十進(jìn)制表示中1出現(xiàn)的次數(shù)卷谈。例如輸入12,從1到12這些整數(shù)中包...
    小小的白菜閱讀 997評(píng)論 0 0
  • 該組字母是一組常用英語單詞的第二個(gè)字母霞篡,你能推算出下一個(gè)字母是什么嗎?N W H O I I ? 答案:前6個(gè)字母...
    博格體閱讀 750評(píng)論 0 0
  • 聽說做對(duì)5道,智商就有140余掖! 答案在最后面寸爆,不要偷看哦 趕快來挑戰(zhàn)吧! 01、移動(dòng)3個(gè)圓圈而昨, 把左邊的三角形變成...
    9f19d909a006閱讀 8,691評(píng)論 0 5
  • 你會(huì)喜歡哪個(gè)季節(jié) 夏雨洪荒還是冬雪蒼茫 微微星夜燈光,我們會(huì)在一夜又一夜的冬風(fēng)中行走 早晨你會(huì)在溫暖的被窩醒來找田,睡...
    白糖蛋黃閱讀 365評(píng)論 0 0
  • 我好怕 再見到你 不過是多掉幾滴眼淚 又或者 無風(fēng)無晴
    思路崎嶇閱讀 138評(píng)論 0 0