leetcode系列 演算法 第183場周賽

2021-10-04 18:42:18 字數 4046 閱讀 4087

目錄

題目一:非遞增順序的最小子序列

解題思路:

**實現:

題目二:將二進位制表示減到1的步驟數

解題思路:

方法一:

方法二:

**實現:

方法一:

方法二:

題目三:最長快樂字串

解題思路:

**實現:

題目四:石子遊戲 iii

解題思路:

**實現:

排序,從後往前去數字,每取乙個判斷是否大於總和的一半

如果大於,則返回結果

將二進位制字串轉成int型變數,按照規則模擬每一步,然後疊加次數

從後向前遍歷每一位,新增乙個進製標識。遍歷時加上進製標識,會有如下幾種情況:

0 : 說明是偶數,步數 + 1

1 : 說明是奇數,需要對當前數字 + 1後除2,才能消除此位,步數 + 2,進製 = 1

2 : 說明原本是奇數,但是加上進製之後變為偶數,步數 + 1,進製 = 1

按照當前剩餘可拼接字元個數排序,從大到小判斷當前字元是否可以拼接

如果可以拼接,則拼接單個字元,更新剩餘個數

如果不可以拼接,按序獲取下乙個字元

直到所有字元均不可拼接或者所有字元用完

博弈論型別的題,動態規劃,從後向前遞推

動態規劃陣列dp第index位儲存的,是如果剩下從index到最後一堆石子時,能夠獲取的最大分數是多少

當剩下最後一位時,因為必須拿取乙個,所以dp陣列的最後一位,等於原陣列的最後一位

之後向前遞推,遞推時新增從最後一位到當前位的總和,更新第index位動態規劃陣列時邏輯如下:

變數:

index : 當前遞推到的下標

dp : 動態規劃陣列(比stonevalue多申請3位,數字均為0。這樣可以不用對於下標進行特殊處理)

curr_sum : 從最後一位到index位的總和

stonevalue : 原始陣列,此處假設陣列為[1, 2, 3, -1, -2, -3, 7]

邏輯(從後向前遍歷stonevalue):

更新curr_sum = curr_sum + stonevalue[index] = 0 + 7 = 7

初始化dp[index] = float('-inf')無窮小

更新dp[index]時的邏輯如下記**,所以更新的式子為dp[index] = curr_sum - min(dp[index + 1], dp[index + 2], dp[index + 3]),目的是盡快能的使得自己獲得的值最大

你的行為

對方開始的下標

對方的最大值

你的最大值

取1個index + 1

dp[index + 1]

curr_sum - dp[index + 1]

取2個index + 2

dp[index + 2]

curr_sum - dp[index + 2]

取3個index + 3

dp[index + 3]

curr_sum - dp[index + 3]

持續上述步驟,直到遍歷到dp[0]

因為alice總是先開始,所以alice可以獲取到的最大分數為dp[0],bob可以獲取到的最大分數為curr_sum - dp[0]

然後判斷alice和bob的分數即可

class solution:

def stonegameiii(self, stonevalue: list[int]) -> str:

dp = [0] * (len(stonevalue) + 3)

curr_sum = 0

for index in range(len(stonevalue) - 1, -1, -1):

dp[index] = float('-inf')

curr_sum += stonevalue[index]

dp[index] = curr_sum - min([dp[index + 1], dp[index + 2], dp[index + 3]])

alice_score = dp[0]

bob_score = curr_sum - dp[0]

if alice_score > bob_score:

return 'alice'

elif alice_score < bob_score:

return 'bob'

return 'tie'

leetcode系列 演算法 第 186 場周賽

右邊的為1的個數,先遍歷一次,計算有多少個1 新增三個變數,left為左半部分0的個數,初始化為0 right為右半部分1的個數,初始化為上一步的統計值 max sum為當前left right的最大值 然後再次遍歷字串,如果是0,則left 1 如果是1,則right 1 更新max sum ma...

python演算法第18天

給定乙個二叉樹,檢查它是否是映象對稱的。關於遞迴的問題主要就是找到遞迴公式,這裡呢就是左子樹和右子樹進行的遞迴 lass solution object defissymmetric self,root if not root return true defdfs left,right if lef...

leetcode演算法第7題

給你乙個 32 位的有符號整數 x 返回 x 中每位上的數字反轉後的結果。如果反轉後整數超過 32 位的有符號整數的範圍 231,231 1 就返回 0。假設環境不允許儲存 64 位整數 有符號或無符號 示例 1 輸入 x 123 輸出 321 示例 2 輸入 x 123 輸出 321 示例 3 輸...