看起来一点都不简单的非递减序列(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;
}
以上是关于看起来一点都不简单的非递减序列(665)的主要内容,如果未能解决你的问题,请参考以下文章
665. Non-decreasing Array只允许修改一位数的非递减数组
C语言必须写main函数?最简单的 Hello world 你其实一点都不懂!