1. 程式人生 > 其它 >力扣 leetcode 665. 非遞減數列 (python)

力扣 leetcode 665. 非遞減數列 (python)

技術標籤:pythonleetcodeleetcode演算法python資料結構

Topic

給你一個長度為 n 的整數陣列,
請你判斷在 最多 改變 1 個元素的情況下,該陣列能否變成一個非遞減數列。
我們是這樣定義一個非遞減數列的: 對於陣列中所有的 i (0 <= i <= n-2),總滿足 nums[i] <= nums[i + 1]。

Example_1

輸入: nums = [4,2,3]
輸出: true
解釋: 你可以通過把第一個4變成1來使得它成為一個非遞減數列。

Example_2

輸入: nums = [4,2,1]
輸出: false
解釋: 你不能在只改變一個元素的情況下將其變為非遞減數列。

Tips

1 <= n <= 10 ^ 4

  • 10 ^ 5 <= nums[i] <= 10 ^ 5

Solution

我們可以利用類似貪心演算法的思路進行判斷

首先我們可以先進行簡單的判斷
如果列表中出現了兩次遞減
那麼直接返回False

用count進行判斷
一次遞減count次數+ 1
count大於一後返回False

之後對只出現一次遞減的情況進行判斷
通過改變陣列後進行判斷

先判斷特殊情況
如果出現的是第一位比第二位大
則將第一位變為第二位的值

正常情況:
可以有兩種情況改變
第一種是改變後者較小的值為更大的值

當遍歷的值後面的值比前一個值更大
則總體上除了遍歷的值後面的值以外是遞增的

則將遍歷的值後面的值改成遍歷的值

第二種是改變大的值為之前的值

當遍歷的值後面的值比前一個值更小
則總體上除了遍歷的值以外是遞增的
則將遍歷的值改成與遍歷值後面的相等

Code

class Solution:
    def checkPossibility(self, nums: List[int]) -> bool:
        count = 0

        for i in range(len(nums) - 1):
            if nums[i] > nums[i + 1]:
                count += 1
                if
count > 1: return False if i == 0: nums[i] = nums[i + 1] else: if nums[i - 1] > nums[i + 1]: nums[i + 1] = nums[i] else: nums[i] = nums[i + 1] return True

Result

在這裡插入圖片描述