力扣 679 24點遊戲

2021-10-08 09:19:06 字數 1451 閱讀 4459

題目描述

你有 4 張寫有 1 到 9 數字的牌。你需要判斷是否能通過 *,/,+,-,(,) 的運算得到 24。

示例 1:

輸入: [4, 1, 8, 7]

輸出: true

解釋: (8-4) * (7-1) = 24

示例 2:

輸入: [1, 2, 1, 2]

輸出: false

注意:除法運算子 / 表示實數除法,而不是整數除法。例如 4 / (1 - 2/3) = 12 。

每個運算子對兩個數進行運算。特別是我們不能用 - 作為一元運算子。例如,[1, 1, 1, 1] 作為輸入時,表示式 -1 - 1 - 1 - 1 是不允許的。

你不能將數字連線在一起。例如,輸入為 [1, 2, 1, 2] 時,不能寫成 12 + 12 。

解題思路

剛看到本題,覺得無從下手,看了別人的題解後,本題好解得益於資料量不算大。方法為首先從4個裡面選2個數,因為操作符涉及到左右,所以是排列不是組合,有12中方式,然後從4個運算子裡選乙個進行操作,因此還剩下3個數,再選2個數,有6種方式,再從4個操作符裡用乙個,操作後還剩2個數,由於設計排列,所以有2種方式,再操作4個運算子種的乙個,因此共有12x6x2x4x4x4,在10000之內,因此時間複雜度不會很大。

這裡首先選取2個數,剩餘的數存進列表,然後從4個運算子選乙個,這裡由於加和乘不用考慮順序問題,因此有乙個判斷,當進行除法時,判斷除數是否為0,不為0時才可以進行除法,然後進行遞迴,想法還是挺簡單的。

class solution(object):

def judgepoint24(self, nums):

if not nums:

return false

if len(nums) == 1:

return abs(nums[0] - 24) < 1e-6

for i in range(len(nums)):

for j in range(len(nums)):

if i != j:

b = [nums[k] for k in range(len(nums)) if i != k != j]

for k in range(4):

if k < 2 and j > i:

continue

if k == 0:

if k == 1:

if k == 2:

if k == 3:

if nums[j] != 0:

else:

continue

if self.judgepoint24(b):

return true

b.pop()

return false

s = solution()

print(s.judgepoint24([8, 1, 6, 6]))

leetcode 679 24點遊戲(回溯)

你有 4 張寫有 1 到 9 數字的牌。你需要判斷是否能通過 的運算得到 24。示例 1 輸入 4,1,8,7 輸出 true 解釋 8 4 7 1 24示例 2 輸入 1,2,1,2 輸出 false注意 除法運算子 表示實數除法,而不是整數除法。例如 4 1 2 3 12 每個運算子對兩個數進行...

力扣 井字遊戲

面試題 16.04.井字遊戲 難度中等6收藏分享切換為英文關注反饋 設計乙個演算法,判斷玩家是否贏了井字遊戲。輸入是乙個 n x n 的陣列棋盤,由字元 x 和 o 組成,其中字元 代表乙個空位。以下是井字遊戲的規則 如果遊戲存在獲勝者,就返回該遊戲的獲勝者使用的字元 x 或 o 如果遊戲以平局結束...

力扣習題 跳躍遊戲

自己的解法 class solution ret k m true if ret.back return ret.back 思路就是用乙個陣列來儲存每個位置的可達性,不斷更新,如果乙個位置可達,那麼它的後nums k 個位置都可達。直到得到最後乙個位置。這樣一來,時間複雜度為o n2 空間複雜度o ...