我正在嘗試解決非遞減陣列問題
給定一個具有 n 個整數的陣列 nums,通過最多修改一個元素來檢查它是否可以變為非遞減。
非遞減定義如下:如果 nums[i] <= nums[i 1] 對于每個 i(從 0 開始)都成立,使得 (0 <= i <= n - 2)。
這是我的解決方案,適用于 [4,2,3] 但不適用于 [-1,4,2,3]
根據我的邏輯,當 [-1,4,2,3] 的指標為 2 時,if 塊將在 i-2(-1) 小于 i(2) 處執行,并且 4 的值將更改到 2 但顯然這不會發生。
#nums=[4,2,3]
nums=[-1,4,2,3]
count=0
for i in range(len(nums)):
if nums[i] < nums[i-1]:
if (i==1 or nums[i-2]<=nums[i]):
nums[i-1]=nums[i]
count =1
else:
nums[i]=nums[i-1]
count =1
print(count<=1)
任何幫助將不勝感激。
uj5u.com熱心網友回復:
您的代碼的主要問題:
- 你回圈
i,range(len(nums))所以它從 開始0,這意味著第一個條件的nums[i] < nums[i-1]計算結果是nums[0] < nums[-1],我認為你根本不想將第一個元素與最后一個元素進行比較。
其余的,當你發現一個問題(即nums[i] < nums[i-1])時,你檢查是否可以將前一個數字降低到當前數字和前一個數字之前的數字之間,然后將其設定為當前數字;如果這不起作用,您只需將當前數字降低到等于前一個數字并計算任何一種情況。
即使count已經是 2 或更大,您也會繼續檢查,這對于長系列來說效率非常低。而且由于您count在任何一種情況下都會增加,因此該增量可能位于條件塊之外。
所以你的代碼變成:
nums = [-1,4,2,3]
count = 0
for i in range(1, len(nums)):
if nums[i] < nums[i-1]:
if (i == 1 or nums[i-2] <= nums[i]):
nums[i-1] = nums[i]
else:
nums[i] = nums[i-1]
if (count := count 1) > 1: # parentheses not needed, but for clarity
break
print(count<=1)
請注意,您的解決方案僅適用于最大 1 個缺陷。變成一個函式,考慮一下:
def almost_non_decreasing(nums, max_flaws=1):
count = 0
for i in range(1, len(nums)):
if nums[i] < nums[i - 1]:
if (i == 1 or nums[i - 2] <= nums[i]):
nums[i - 1] = nums[i]
else:
nums[i] = nums[i - 1]
if (count := count 1) > max_flaws:
return False
return True
print(almost_non_decreasing([-1, 4, 2, 3]))
print(almost_non_decreasing([5, 4, 2, 3]))
print(almost_non_decreasing([5, 4, 2, 3], 2))
最后一個 print False,即使[2, 2, 2, 3]可以作業,但是您的解決方案只會[4, 4, 4, 3]在需要更改最終結果時嘗試然后失敗3。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/425132.html
標籤:Python 数组 python-3.x
