看起来一点都不简单的非递减序列(665)

Posted Hensenberg_Posion

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了看起来一点都不简单的非递减序列(665)相关的知识,希望对你有一定的参考价值。

题目描述
给你一个长度为 n 的整数数组,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。

我们是这样定义一个非递减数列的: 对于数组中任意的 i(0 <= i <= n - 2),总满足 nums[i] <= nums[i + 1]。

示例 1:

输入: nums = [4, 2, 3]
输出 : true
解释 : 你可以通过把第一个4变成1来使得它成为一个非递减数列。

题目分析
遍历数组,如果是降序就修改,只能修改一次,如果之后再出现了降序就返回false。这是最开始想的,但是这样修改不知道修改成啥样的,所以看三个值是最好的,所以遍历是从第二个数开始,首先判断nums[0]和nums[1]的大小,确定后面是否还能够进行修改,这里引入了bool变量来判断是否还能进行修改。最好的修改方式是将降序的前面的数变小,这样不会影响到后面的数。第二种修改方式是将后面的数字变大。

#include<iostream>
using namespace std;
#include<vector>

class Solution {
public:
    bool checkPossibility(vector<int>& nums) {
        if (nums.size() == 1)
            return true;
        bool flag = nums[0] < nums[1] ? true : false;
        int i;
        for (i = 1; i < nums.size()-1; i++)
        {
            if (nums[i] > nums[i + 1])
            {
                if (flag)   //看是否有修改机会
                {
                    if (nums[i + 1] >= nums[i - 1])  //修改方案1,这是最好的修改方案
                    {
                        nums[i] = nums[i + 1];
                        flag = false;
                    }
                    else     //修改方案2
                    {
                        nums[i + 1] = nums[i];
                        flag = false;
                    }
                }
                else
                {
                    return false;  //没有修改机会了,直接返回false
                }
            }
        }
        return true;
    }
};
int main()
{
    Solution s;
    vector<int>nums;
    nums.push_back(4);
    nums.push_back(2);
    nums.push_back(3);
    bool resault = s.checkPossibility(nums);
    cout << resault << endl;
	return 0;
}

1就是true

以上是关于看起来一点都不简单的非递减序列(665)的主要内容,如果未能解决你的问题,请参考以下文章

看起来一点都不简单的非递减序列(665)

665. Non-decreasing Array只允许修改一位数的非递减数组

C语言必须写main函数?最简单的 Hello world 你其实一点都不懂!

需求很简单:实现win10的开机自启Flask网站,可这一点都不简单

这样做动画交互,一点都不费力!

LeetCode 665. 非递减数列(Non-decreasing Array)