Leetcode 665 非遞減數列

2021-09-05 09:29:03 字數 1594 閱讀 9296

給定乙個長度為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, 10,000]。

解題思路:

查詢逆序對,逆序對的個數超過2,則必然return false;

逆序對只有乙個,假設nums[pos]>nums[pos+1];在pos之前都是非逆序,pos+1之後也是非逆序。

可以修改nums[pos]的值,或者修改nums[pos+1]的值,使得整個序列滿足非逆序關係。

接下來只需考慮,這兩個數中的乙個的修改範圍。如果修改nums[pos],那麼必須滿足以下:

nums[pos]>=nums[pos-1]

nums[pos]<=nums[pos+1]

很顯然,整個區間是[nums[pos-1],nums[pos+1]],閉區間。這樣一來,nums[pos-1],nums[pos],nums[pos+1]三個數構成非逆序,進一步得到整個陣列是非逆序的。區間存在的前提條件是nums[pos-1]<=nums[pos+1]

另外,如果修改nums[pos+1],那麼修改後的nums[pos+1]必須滿足以下:

nums[pos+1]>=nums[pos]。

nums[pos+1]<=nums[pos+2]

很顯然,整個區間是[nums[pos],nums[pos+2]],閉區間。這樣一來,nums[pos],nums[pos+1],nums[pos+2]構成非逆序,進一步得到整個陣列是非逆序的。區間存在的前題條件是nums[pos],nums[pos+2]

終上所述,如果要修改只有乙個逆序對的陣列,必須要滿足這兩個前提條件之一,注意陣列溢位,換句話說,如果這兩個條件都不滿足,也就意味著修改乙個數不可能使整個陣列變成非逆序。到此就嚴格地說明了整個過程的可行性。

非遞減數列 leetcode665

class solution object defcheckpossibility self,nums type nums list int rtype bool 判斷截斷點,對截斷點進行分析 count 0 i 0length len nums for j in range length 1 if...

leetcode 665 非遞減數列

非遞減數列 給你乙個長度為 n 的整數陣列,請你判斷在 最多 改變 1 個元素的情況下,該陣列能否變成乙個非遞減數列。我們是這樣定義乙個非遞減數列的 對於陣列中所有的 i 0 i n 2 總滿足 nums i nums i 1 示例 1 輸入 nums 4,2,3 輸出 true 解釋 你可以通過把...

leetcode 665 非遞減數列

給你乙個長度為 n 的整數陣列,請你判斷在 最多 改變 1 個元素的情況下,該陣列能否變成乙個非遞減數列。我們是這樣定義乙個非遞減數列的 對於陣列中所有的 i 0 i n 2 總滿足 nums i nums i 1 示例 1 輸入 nums 4,2,3 輸出 true 解釋 你可以通過把第乙個4變成...