力扣 leetcode 665. 非遞減數列 (python)
阿新 • • 發佈:2021-02-08
技術標籤: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