目錄
題目一:非遞增順序的最小子序列
解題思路:
**實現:
題目二:將二進位制表示減到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 輸...