Leetcode:No.679 24 Game

You have 4 cards each containing a number from 1 to 9. You need to judge whether they could operated through *, /, +, -, (, ) to get the value of 24.
Example 1:
Input: [4, 1, 8, 7]
Output: True
Explanation: (8-4) * (7-1) = 24
Example 2:
Input: [1, 2, 1, 2]
Output: False
Note:

  1. The division operator / represents real division, not integer division. For example, 4 / (1 - 2/3) = 12.
  2. Every operation done is between two numbers. In particular, we cannot use - as a unary operator. For example, with [1, 1, 1, 1] as input, the expression -1 - 1 - 1 - 1 is not allowed.
  3. You cannot concatenate numbers together. For example, if the input is [1, 2, 1, 2], we cannot write this as 12 + 12.

24點游戲,不過這里每個數(shù)都是1-9国葬,并不是撲克牌慧耍。題目并沒有直說4個都要用到诬像,但是看例子是這個意思跪腹,實際上也是這個意思。
這個題目有一個不大不小的坑开伏,需要對計算機系統(tǒng)有一定了解膀跌,一般算法題還涉及不到,那就是浮點數(shù)的精度丟失固灵。有興趣的可以去搜索或者參考這篇文章捅伤,這里不多講,只是在做題的時候留個心眼巫玻,不能直接比較24丛忆,而是引進一個足夠小的數(shù)eps來抵消誤差。這里因為數(shù)字小仍秤,步驟也不多熄诡,所以eps=0.001足夠了。
也就是說诗力,只要數(shù)值x滿足abs(x-24) <= eps我們就認為x=24.

那么具體到問題中來凰浮。24點我們自然不陌生,但是要怎么下手呢姜骡?舉例好像沒什么用导坟,畢竟有時候我們自己也不知道怎么解∪Τ海看起來只能采用“暴力”一點的方法了惫周。好在數(shù)字小,4個數(shù)的康栈,4種基礎(chǔ)運算方式递递,怎么折騰都翻不了天。
括號的加入讓問題看起來復(fù)雜了一些啥么,但是本質(zhì)上不影響登舞。因為還是可以逐對計算,而如果全部可能都覆蓋到的話悬荣,括號自然也就考慮到了菠秒。
所以初步判斷這是一個DFS或者遞歸的問題。關(guān)于這類問題平時有一個需要考慮的就是剪枝氯迂,不過這里還是因為數(shù)字小践叠,另外其實也不好剪,除非你算一下不然你怎么知道可不可以呢嚼蚀?

好吧禁灼,那就嘗試開始編。排序是沒必要了轿曙,結(jié)果可能會搞亂順序弄捕。
遞歸解法:

# Time:  O(n^3 * 4^n) = O(1), n = 4
# Space: O(n^2) = O(1)
from operator import add, sub, mul, truediv
class Solution(object):
    def judgePoint24(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        if len(nums) == 1:
            return abs(nums[0]-24) <= 1e-3
        ops = [add, sub, mul, truediv]
        for i in xrange(len(nums)):
            for j in xrange(len(nums)):
                if i == j:
                    continue
                next_nums = [nums[k] for k in xrange(len(nums)) if i != k != j]
                for op in ops:
                    if ((op is add or op is mul) and j > i) or \
                       (op == truediv and abs(nums[j]) <= 1e-3):
                        continue
                    next_nums.append(op(nums[i], nums[j]))
                    if self.judgePoint24(next_nums):
                        return True
                    next_nums.pop()
        return False

其實用operator沒啥必要僻孝,就是看起來cool一點。
雖說暴力守谓,但是能優(yōu)化還是盡量優(yōu)化穿铆,比如加法乘法就沒必要換個順序再來一遍,另外除數(shù)為0也不行分飞。
這些對應(yīng)if ((op is add or op is mul) and j > i) or (op == truediv and abs(nums[j]) <= 1e-3):這個條件悴务。
另外這個先append試一試再pop出來,英文里面叫做back tracking譬猫,即回溯讯檐,是面對同類問題里面經(jīng)常使用的方法,好處就是和下一層分離染服,等遞歸回來以后可以當(dāng)無事發(fā)生過繼續(xù)下一個别洪,值得了解一下。

總結(jié):

算是比較典型的DFS遞歸問題柳刮。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挖垛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子秉颗,更是在濱河造成了極大的恐慌痢毒,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚕甥,死亡現(xiàn)場離奇詭異哪替,居然都是意外死亡,警方通過查閱死者的電腦和手機菇怀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門凭舶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人爱沟,你說我怎么就攤上這事帅霜。” “怎么了呼伸?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵身冀,是天一觀的道長。 經(jīng)常有香客問我括享,道長闽铐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任奶浦,我火速辦了婚禮,結(jié)果婚禮上踢星,老公的妹妹穿的比我還像新娘澳叉。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布成洗。 她就那樣靜靜地躺著五督,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓶殃。 梳的紋絲不亂的頭發(fā)上充包,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機與錄音遥椿,去河邊找鬼基矮。 笑死,一個胖子當(dāng)著我的面吹牛冠场,可吹牛的內(nèi)容都是我干的家浇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼碴裙,長吁一口氣:“原來是場噩夢啊……” “哼钢悲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起舔株,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤莺琳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后载慈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惭等,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年娃肿,在試婚紗的時候發(fā)現(xiàn)自己被綠了咕缎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡料扰,死狀恐怖凭豪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情晒杈,我是刑警寧澤嫂伞,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站拯钻,受9級特大地震影響帖努,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜粪般,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一拼余、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧亩歹,春花似錦匙监、人聲如沸凡橱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稼钩。三九已至,卻和暖如春达罗,著一層夾襖步出監(jiān)牢的瞬間坝撑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工粮揉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巡李,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓滔蝉,卻偏偏與公主長得像击儡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蝠引,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

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

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,334評論 0 10
  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,810評論 0 38
  • 路遙在《平凡的世界》里寫道:我們寧愿去關(guān)心一個蹩腳演員的吃喝拉撒螃概,也不愿意了解你身邊任何一個朋友波瀾壯闊的內(nèi)心矫夯。這...
    芳寶落落閱讀 647評論 12 10
  • “唧唧”“唧唧唧” 寂靜的客廳突然聽到幾聲清脆的鳥叫。咦吊洼,哪里來的這種聲音训貌,我可住的是城里20層的單元樓呀。 “唧...
    弓文銳閱讀 527評論 0 4
  • 在時代洪流中掙扎冒窍,fatigue递沪、frustrated,swim forward,but still here. ...
    Boryan閱讀 630評論 0 0