前往
大廳
主題

LeetCode - 665. Non-decreasing Array 解題心得

Not In My Back Yard | 2020-12-15 00:00:04 | 巴幣 0 | 人氣 177

題目連結:


題目意譯:
給定一個有 n 個整數的陣列 nums,你的任務是去檢查其是否可以藉由修改「至多」一個元素值使其變為一個非遞減數列。

我們定義一個陣列為非遞減者對於每個 i 值(索引值從 0 開始,0 ≦ i ≦ n - 2)滿足 nums[i] ≦ nums[i + 1]。

限制:
1 ≦ n ≦ 10 ^ 4
- 10 ^ 5 ≦ nums[i] ≦ 10 ^ 5



範例測資:
範例 1:
輸入: nums = [4,2,3]
輸出: true
解釋: 你可以修改第一個 4 變成 1 而得到一個非遞減陣列。

範例 2:
輸入: nums = [4,2,1]
輸出: false
解釋: 你不能藉由修改至多一個元素而得到一個非遞減陣列。


解題思維:
掃過陣列看有沒有位置 i 滿足 nums[i] > nums[i + 1]。如果超過一個以上,就表示不可能藉由更動一個元素值來使原陣列變成非遞減;而如果沒有任何一個就代表本來就是非遞減所以也不需要更動。

但是如果只有一個這樣子的位置時,因為資訊不足而無法直接判斷出來。因此我們需要比對以下的可能(假設索引值從 0 開始):
當 i = 0 時,因為它前面也沒有其他元素,因此直接更動它的值(讓值變小)是可行的;
當 i = n - 2 時,因為位置 i + 1 後面已經沒有其他的元素了,所以直接更改位置 i + 1 的元素值(讓它的值變大)即可;
當 nums[i - 1] ≦ nums[i + 1] 時,代表我們可以將位置 i 的元素值改為位置 i - 1 的值即可讓 nums[i] ≦ nums[i + 1];
當 nums[i] ≦ nums[i + 2] 時,代表我們可以將位置 i + 1 的元素值改為位置 i + 2 的值即可讓 nums[i] ≦ nums[i + 1];
以上四種可能只要有一個符合即代表可以只修改一個元素值而達成非遞減;反之則代表不行。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作