Leetcode 665. Non-decreasing Array
阿新 • • 發佈:2018-12-12
一、問題描述
Given an array with n integers, your task is to check if it could become non-decreasing by modifying at most 1 element.
We define an array is non-decreasing if array[i] <= array[i + 1] holds for every i (1 <= i < n).
Note: The n belongs to [1, 10,000].
Example1
Input: [4,2,3] Output: True Explanation: You could modify the first 4 to 1 to get a non-decreasing array.
Example2
Input: [4,2,1]
Output: False
Explanation: You can't get a non-decreasing array by modify at most one element.
二、題意分析
最多修改陣列中一個數的值,判斷是否可以使它是單調不減陣列,array[i] <= array[i + 1] ,如果可以就返回true,否則false
三、解題思路
思路也很簡單,統計反序的次數。 如果次數大於一次,那麼肯定是不可以通過修改一個數的值,使之有序; 而對於只出現一次反序的情況,處理方式是讓反序的兩個數相等,此時,我們就需要判斷等於誰,才可以使陣列有序,分兩種情況: ①讓他們都等於大的數; ②等於小的那個數。 只要其中之一操作可以使陣列有序,就返回true,否則,就返回false。
程式碼實現
class Solution {
public boolean checkPossibility(int[] nums) {
if(nums.length < 3)
return true;
int counts = 0, index = 0;
for(int i = 1; i < nums.length; i++){
if(nums[i] < nums[i-1]){
counts++;
// index指向大的數
index = i - 1;
}
}
// System.out.println(counts);
if(counts > 1)
return false;
// 邊界判斷
if(counts == 0 || index == 0 || index == nums.length - 2)
return true;
// 令小的那個數等於大的:nums[index+1] = nums[index]
if(index + 2 < nums.length && nums[index + 2] >= nums[index])
return true;
// 令大的那個數等於小的:nums[index] = nums[index+1]
if(nums[index - 1] <= nums[index+1])
return true;
return false;
}
}
時間、空間複雜度分析
- 時間複雜度
O (n)
- 空間複雜度
O(1)