leetcode系列 演算法 第 186 場周賽

2021-10-05 11:43:48 字數 3476 閱讀 6230

右邊的為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)

第1層 :(1,0), (0,1)

第2層 : (2,0), (1,1), (0,2)

第n層 :(n,0), (n - 1, 1), (n - 2, 2), ..., (0, n)

可以看出,i + j就是所在的層

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 輸...