题目描述:

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).

Example 1:

Input: [4,2,3]
Output: True
Explanation: You could modify the first 4 to 1 to get a non-decreasing array.

Example 2:

Input: [4,2,1]
Output: False
Explanation: You can't get a non-decreasing array by modify at most one element.

Note: The n belongs to [1, 10,000].

要完成的函数:

bool checkPossibility(vector<int>& nums)

说明:

1、这道题目给定一个vector,要判断这个vector至多改变一个元素的值之后,是不是变成了非减序列。

首先笔者想的是,比如序列[1,4,2,3],这个序列改变4的值也就可以了,这样子的序列中间必然会有一个凸起,4就是这个凸起。

那我们可以先找到这个凸起,从前往后找跟从后往前找,如果只有一个凸起的话,那么就接着判断,如果有多个凸起,那么必定不能只改一个元素。

部分代码如下:

        int s1=nums.size();
int i=,j=s1-;
while(i<s1-)
{
if(nums[i]<=nums[i+])
i++;
else
break;
}
if(i==j)//当整个序列非降序排列
return true;
while(j>i)
{
if(nums[j]>=nums[j-])
j--;
else
break;
}
if((j-)!=i)//如果中间有多个元素
return false;

这样子就记录了i和j的值。

2、当确实只有一个凸起时,我们进行下一步判断。

还是以上面提到的序列为例子,[1,4,2,3],i=1,j=2,这个凸起的形成是由于nums[i]>nums[j],那我们可以改i这一位的值,也可以改j这一位的值,使得nums[i]<=nums[j]。

怎么判断什么时候要改i的值,什么时候要改j的值?

比如[3,4,2,5],i=1,j=2,这时候由于nums[i]的前一位3,大于nums[j]=2,所以我们只能修改j这一位的值,而不能修改i这一位的值。

那如果nums[i]的值,还是比nums[j]的下一位大呢,这时候我们就算修改j这一位的值,修改完也不能形成非减序列,这时候就要返回false。

如果nums[i]的值,小于等于nums[j]的下一位,那这时候就要返回true了。

还有另一种情况,如果nums[i]的前一位,小于等于nums[j],比如上面提到的[1,4,2,3],i=1,j=2,那这时候我们就可以修改i的值了,直接返回true即可。

代码如下:

        if(i!=)
{
if(nums[i-]>nums[j])//只能改j这一位
{
if(j==s1-)
return true;
if(nums[i]>nums[j+])
return false;
return true;
}
else
return true;
}
return true;//如果i==0,那么直接修改nums[i]的值就可以了

上述代码虽然考虑的过程繁琐了点,但是实测38ms,beats 86.96% of cpp submissions,效果还是可以的。

3、附上完整代码,分享给大家,如下:

    bool checkPossibility(vector<int>& nums)
{
int s1=nums.size();
int i=,j=s1-;
while(i<s1-)
{
if(nums[i]<=nums[i+])
i++;
else
break;
}
if(i==j)
return true;
while(j>i)
{
if(nums[j]>=nums[j-])
j--;
else
break;
}
if((j-)!=i)
return false;
if(i!=)
{
if(nums[i-]>nums[j])//只能改j这一位
{
if(j==s1-)
return true;
if(nums[i]>nums[j+])
return false;
return true;
}
elsereturn true;
}
return true;
}

leetcode-665-Non-decreasing Array的更多相关文章

  1. 【LeetCode】659. Split Array into Consecutive Subsequences 解题报告(Python)

    [LeetCode]659. Split Array into Consecutive Subsequences 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id ...

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

    665. 非递减数列 665. Non-decreasing Array 题目描述 给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元素的情况下,该数组能否变成一个非递减数列. 我们是 ...

  3. LeetCode 665. Non-decreasing Array (不递减数组)

    Given an array with n integers, your task is to check if it could become non-decreasing by modifying ...

  4. Leetcode 665. Non-decreasing Array(Easy)

    Given an array with n integers, your task is to check if it could become non-decreasing by modifying ...

  5. LeetCode算法题-Non-decreasing Array(Java实现)

    这是悦乐书的第283次更新,第300篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第151题(顺位题号是665).给定一个包含n个整数的数组,您的任务是通过修改最多1个元 ...

  6. 【LeetCode】896. Monotonic Array 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  7. 【LeetCode题解】数组Array

    1. 数组 直观地看,数组(Array)为一个二元组<index, value>的集合--对于每一个index,都有一个value与之对应.C语言中,以"连续的存储单元" ...

  8. LeetCode 238. Product of Array Except Self (去除自己的数组之积)

    Given an array of n integers where n > 1, nums, return an array output such that output[i] is equ ...

  9. LeetCode 108. Convert Sorted Array to Binary Search Tree (有序数组转化为二叉搜索树)

    Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 题目 ...

  10. LeetCode 88. Merge Sorted Array(合并有序数组)

    Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:Yo ...

随机推荐

  1. Linux虚拟机磁盘扩容

    扩容步骤如下: 1.添加一块物理硬盘 2.fdisk将硬盘分区,选primary分区,创建1-4个 3.分区类型格式化,选择t,输入LVM代号 4.分好后按w退出 如果是调整原有逻辑卷大小,则先调整原 ...

  2. 28-Truck History(poj1789最小生成树)

    http://poj.org/problem?id=1789 Truck History Time Limit: 2000MS   Memory Limit: 65536K Total Submiss ...

  3. fastdfs 上传和下载 有用

    一.FastDFS解决什么样的问题 1.存储空间可扩展. 2.提供一个统一的访问方式. 使用FastDFS,分布式文件系统.存储空间可以横向扩展,可以实现服务器的高可用.支持每个节点有备份机. 二.什 ...

  4. js失去焦点触发

    onblur="displayRest($(this))"

  5. 独立看门狗实验-IWDG

    为什么要看门狗? 注意:喂狗是0XAAAA写到KR. 头文件iwdg.h iwdg.c

  6. C# 实现对PPT编辑

    C# Presentation 文本替换 我们可以通过插入占位符的方式,使用新的字词替换已有幻灯片里的文字. 本文将详细描述如何使用Spire.Presentation 来替换Prsentation ...

  7. Android-ContentProvider简单的增删改查

    注意:在ContentProvider里面写对数据库增删改查的时候,千万不能 db.close();  cursor.close(); 等操作,不然其他应用访问不到数据,也没有必要写isOpen(); ...

  8. Java == 和 equals 比较

    在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String(&qu ...

  9. 2014-3tomcat遇到的问题汇总

    tomcat启动不起来 端口占用:加了apache的ajp,所以要打开ajp_port,结果被占用了. 权限不够:chown:各个文件的权限都不够,特别是日志文件的. 配置问题:应用 servlet- ...

  10. Replication--使用MSlogreader_history查看日志读起的延迟和事务命令

    --======================================================================== MSlogreader_history 表存放本地 ...