Python程式:計算將列表轉換為非遞增列表所需的運算次數
假設我們有一個名為nums的數字列表。現在讓我們考慮一個操作,我們將兩個連續的值合併成一個值,方法是將它們相加。我們必須找到使列表變為非遞減所需的最小操作次數。
因此,如果輸入類似於nums = [2, 6, 4, 10, 2],則輸出將為2,因為我們可以將[2, 6]合併得到[8, 4, 10, 2],然後將[8, 4]合併得到[12, 10, 2]。
為了解決這個問題,我們將遵循以下步驟:
如果nums為空,則
返回0
在nums的末尾插入-∞
N := nums的大小
dp := 一個大小為N的列表,並填充0
arr := 一個大小為N的列表,並填充0
p := arr的大小
arr[p-1] := nums[N-1]
arr[p-2] := nums[N-2]
對於範圍N - 3到0的i,遞減1,執行:
j := i
x := nums[j]
當j < N - 1且x < arr[j + 1]時,執行:
j := j + 1
x := x + nums[j]
dp[i] := j - i + dp[j + 1]
arr[i] := x
返回dp[0]
讓我們看看下面的實現以更好地理解:
示例
class Solution: def solve(self, nums): if not nums: return 0 nums.append(float("−inf")) N = len(nums) dp = [0] * N arr = [0] * N arr[−1] = nums[−1] arr[−2] = nums[−2] for i in range(N − 3, −1, −1): j = i x = nums[j] while j < N − 1 and x < arr[j + 1]: j += 1 x += nums[j] dp[i] = j − i + dp[j + 1] arr[i] = x return dp[0] ob = Solution() nums = [2, 6, 4, 10, 2] print(ob.solve(nums))
輸入
[2, 6, 4, 10, 2]
輸出
2
廣告