Python程式:查詢“有效”陣列的最大值
假設我們有一個包含n個整數的陣列'nums'。'nums'中的每個值代表其“能量”。如果陣列的長度大於2且陣列的第一個和最後一個值相等,則該陣列將被評估為“有效”。我們必須透過從陣列中刪除元素來使陣列有效,以便其餘元素可以滿足條件。作為輸出,我們返回透過新增陣列的所有能量值獲得的陣列的最大可能能量值。
因此,如果輸入類似於nums = [3, 4, 5, 3, 4],則輸出將為16。
如果我們從陣列nums中移除第一個值3,則它變為[4, 5, 3, 4]。這是一個有效的陣列,能量之和為4 + 5 + 3 + 4 = 16。這是從給定輸入中獲得的任何有效陣列的最大可能和。
為了解決這個問題,我們將遵循以下步驟:
table := 一個新的對映
prefix := 一個初始化值為0的新列表
negative := 一個初始化值為0的新列表
對於nums中的每個索引i和值j,執行以下操作:
如果table中不存在j,則
table[j] := 一個新的對(i, 0)
否則,
table[j, -1] := i
向prefix新增一個新元素,該元素等於prefix的最後一個元素 + j
複製negative的最後一個元素
如果j < 0,則
negative的最後一個元素 := negative的最後一個元素 + j
ans := 負無窮大
對於table的所有值中的每個對(i,j),執行以下操作:
如果j不等於0,則
sm1 := prefix[j+1] - prefix[i]
如果j > i+1,則
sm2 := negative[j] - negative[i+1]
否則,
sm2 := 0
ans := (ans, sm1 - sm2)中的最大值
返回ans
示例
讓我們檢視以下實現以獲得更好的理解:
def solve(nums): table = {} prefix = [0] negative = [0] for i, j in enumerate(nums): if j not in table: table[j] = [i, 0] else: table[j][-1] = i prefix += prefix[-1] + j, negative += negative[-1], if j < 0: negative[-1] += j ans = float('-inf') for i,j in table.values(): if j != 0: sm1 = prefix[j+1] - prefix[i] sm2 = negative[j] - negative[i+1] if j > i+1 else 0 ans = max(ans, sm1 - sm2) return ans print(solve([3, 4, 5, 3, 4]))
輸入
[3, 4, 5, 3, 4]
輸出
16
廣告