右邊的為1的個數,先遍歷一次,計算有多少個1
新增三個變數,left為左半部分0的個數,初始化為0;right為右半部分1的個數,初始化為上一步的統計值;max_sum為當前left + right的最大值
然後再次遍歷字串,如果是0,則left += 1;如果是1,則right -= 1;更新max_sum = max(max_sum, left + right)
假設一共有n個數字;每次從左右各取乙個數字,取k個數字的最大和,可以轉換為連續子串行為n - k個數字的最小和問題
求出n - k個元素的連續子串行最小和,然後用總和減去最小和,就是最大和
假設每乙個對角線為一層,即對於第乙個nums = [[1, 2, 3], [4, 5, 6], [7, 8, 9]],每個對角線分層的結果為:
第一層 = [1]如果按照這個順序拼接好,然後按照層的順序將陣列拼接,就是最終結果第二層 = [4, 2]
第三層 = [7, 5, 3]
第四層 = [8, 6]
第五層 = [9]
假設乙個數字的下標為nums[i][j],可以看出下記對應關係:
第0層 : (0,0)可以看出,i + j就是所在的層第1層 :(1,0), (0,1)
第2層 : (2,0), (1,1), (0,2)
第n層 :(n,0), (n - 1, 1), (n - 2, 2), ..., (0, n)
class solution:
def finddiagonalorder(self, nums: list[list[int]]) -> list[int]:
rec = collections.defaultdict(list)
for i in range(len(nums)):
for j in range(len(nums[i])):
curr_key = i + j
res =
for key in sorted(rec.keys()):
# 因為是按行遍歷的,所以這裡需要反轉一下,才是題目要求的順序
從前向後遍歷,遍歷的同時新增乙個優先佇列和當前遍歷過的最大值,儲存之前每一位的和
在遍歷到第 i 位時,當前位置的最大值,是從 i - k 到 i 的最大值 + i 的值
然後更新遍歷過的最大值
import queue
class solution:
def constrainedsubsetsum(self, nums: list[int], k: int) -> int:
max_sum = nums[0]
q = queue.priorityqueue()
# 因為優先佇列的get獲取的是最小值,所以這裡 * -1,使得最大值變為最小值
# 後續 * -1的處理原因相同
q.put((nums[0] * -1, 0))
for idx in range(1, len(nums)):
while not q.empty():
pre_max, pre_idx = q.get()
if idx - pre_idx > k:
continue
q.put((pre_max, pre_idx))
curr_max = max(pre_max * -1 + nums[idx], nums[idx])
max_sum = max(max_sum, curr_max)
q.put((curr_max * -1, idx))
break
return max_sum
這次周賽總體來說挺簡單的
但是最後一題還是在時限內沒有提交成功;開始沒想到使用優先佇列,都是用dp陣列儲存每一位的最大值
然後從第i位向前遍歷k個數字找最大值。結果一直超時
直到比賽完吃飯時候才想到用優先佇列來儲存,修改後一次提交成功。與本次第一名的差距為:
也就是第一名已經做完最後一題了,我第二題還沒做完
回想昨天的團隊賽週賽,第一題看了1個多小時沒想出來具體公式怎麼計算,結果首次參加競賽,但是卻沒成功提交一道題
需要學習的東西還有很多啊,菜雞乙個=,=
leetcode系列 演算法 第183場周賽
目錄 題目一 非遞增順序的最小子序列 解題思路 實現 題目二 將二進位制表示減到1的步驟數 解題思路 方法一 方法二 實現 方法一 方法二 題目三 最長快樂字串 解題思路 實現 題目四 石子遊戲 iii 解題思路 實現 排序,從後往前去數字,每取乙個判斷是否大於總和的一半 如果大於,則返回結果 將二...
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 輸...