1. 程式人生 > >Leetcode 665. Non-decreasing Array

Leetcode 665. Non-decreasing Array

一、問題描述

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; } }

時間、空間複雜度分析

  1. 時間複雜度

O (n)

  1. 空間複雜度

O(1)

在這裡插入圖片描述