看起来一点都不简单的非递减序列(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值