給定乙個長度為 n 的整數陣列,你的任務是判斷在最多改變 1 個元素的情況下,該陣列能否變成乙個非遞減數列。
我們是這樣定義乙個非遞減數列的: 對於陣列中所有的 i (1 <= i < n),滿足 array[i] <= array[i + 1]。
示例1:
輸入
: [4,2,3]
輸出: true
解釋: 你可以通過把第乙個4變成1來使得它成為乙個非遞減數列。
示例2:
輸入
: [4,2,1]
輸出: false
解釋: 你不能在只改變乙個元素的情況下將其變為非遞減數列。
說明:n的範圍為[1,10000]
題目理解:只能動乙個數字,將數列調整成非遞減數列,非遞減就是前乙個不能大於後乙個大,換句話說,後乙個大於等於前乙個
知識點:陣列
1. 如果陣列長度小於3,返回true
2. 查詢逆序對:如果超過2個,返回false
3. 如果只有1個,則需要考慮修改哪個數:num[index]還是 num[index+1]
3.1 修改num[index]
,修改後的條件為:num[index-1]
<= num[index]
<= num[index+1]
,也就是說修改的數要在兩者之間進行取值。
區間存在的前題條件是*nums[index-1]
< nums[index+1]
*eg:[3,
2,4,
5]中將2改為3
,即:[3,
3,4,
5]3.2 修改num[index+1]
,修改後的條件為:num[index]
<= num[index+1]
<= num[index+2]
區間存在的前題條件是*nums[index]
< nums[index+2]
*eg:[3,
4,2,
5]中將2改為4
,即:[3,
4,4,
5]綜3.1和3.2所述,如果要修改只有乙個逆序對的陣列,必須要滿足這兩個前提條件之一。
換句話說,如果這兩個條件都不滿足,也就意味著修改乙個數不可能使整個陣列變成非逆序。
python3
class solution
: def checkpossibility
(self, nums: list[int])-
> bool:
length =
len(nums)
if length <3:
return true
count =
0 # 逆序次數
for index in
range
(length -1)
:if nums[index]
<= nums[index+1]
:continue
if count >
0: # 有至少兩個地方出現遞減時,不可能使整個序列非遞減
return false
count +
=1 # 標記已經出現遞減,已經使用了修改乙個元素的機會
# index為0,則修改nums[
0]即可;
# index為length-
2, 修改nums[length-
1]即可;
# index不為0, length-
2時, index-
1, index, index+
1, index+
2不會越界
# nums[index]
<= nums[index+
2],可以修改nums[index+1];
# nums[index-1]
<= nums[index+
1], 可以修改nums[index]
if index in(0
, length -
2) or nums[index]
<= nums[index+
2] or nums[index-1]
<= nums[index+1]
:continue
return false
return true
665 非遞減數列 簡單
題目 於力扣 leetcode 目錄665.非遞減數列 說明 因可以改變一次陣列元素的值,那麼定義乙個變數用來記錄改變元素的次數,大於 1 次時即返回 false遍歷陣列,判斷當前遍歷元素是否小於前乙個元素 小於前乙個元素時,還需要判斷是否小於前二個元素 如果小於前乙個且小於前二個元素時,那麼只能將...
665 非遞減數列
思路 遍歷整個陣列,如果遇到nums i nums i 1 的情況,則要麼修改nums i 要麼修改nums i 1 若修改一次就能成功,則去掉nums i 或者num i 1 剩下的陣列必然是非遞減的。class solution def checkpossibility self,nums ty...
665 非遞減數列
給定乙個長度為 n 的整數陣列,你的任務是判斷在最多改變 1 個元素的情況下,該陣列能否變成乙個非遞減數列。我們是這樣定義乙個非遞減數列的 對於陣列中所有的 i 1 i n 滿足 array i array i 1 示例 1 輸入 4,2,3 輸出 true 解釋 你可以通過把第乙個4變成1來使得它...