转自九章算法公众号

题目描述

给出包含n个整数的数组,你的任务是检查它是否可以通过修改至多一个元素变成非下降的。一个非下降的数组array对于所有的i(1<=i<n)满足array[i-1]<=array[i]。n属于区间[1,10000]。

样例1:

ⅰ 输入: [4,2,3]

ⅱ 输出: True

ⅲ 说明: 可以把第一个数4修改为1,得到[1,2,3]为非下降的数组

样例2:

ⅰ 输入: [4,2,1]

ⅱ 输出: False

ⅲ 说明: 无法通过修改至多一个元素使数组变为非下降的。

题解:

a. 简单的思考可以得到,情况无非为三种:不需要修改就满足条件的、修改一个元素可满足条件的和修改一个元素也无法满足条件的。对于第一种情况,只需遍历数组看是否满足数组的每一项都大于等于前一项,满足则返回true。对于第二种情况,可以枚举要修改的那个数array[i],再去检查array[i]之前的数是否是非下降的,array[i]之后的数是否是非下降的,最后还应该检查array[i-1]<=array[i+1]是否成立(如果array[i]位于边界则无需检查),如果成立则可以将array[i]改为array[i-1]和array[i+1]之间的任何数使数组变为非下降数组,这是情况二,返回true,如果对于所有的i都不成立,则为情况三,返回false。这样做的时间复杂度为O(n^2),额外空间复杂度为O(1)。

b. 修改一个数以后可以变成非下降的数组满足什么条件呢?显然,这样的数组应当满足只存在一对相邻的数不满足非下降的条件,即只存在唯一的i(1<=i<n)满足array[i-1]>array[i],可以断言,如果这样的i存在多个,则原数组无法通过修改至多一个数变为非下降数组。那么是否满足这个条件的数组都可以通过修改一个数而满足非下降呢?不是的,比如[2,4,1,3],只有相邻的4,1不满足非下降,但它不能通过只改变一个数变为非下降。其实,如果只存在一个i满足array[i-1]>array[i],那么要修改的那个数一定在array[i-1]和array[i]这两个数之中,那么就可以套用上一种做法,对于两种情况分别进行判断即可。更进一步地来说,由于只有对于i才有array[i-1]>array[i]成立,所以别的所有相邻的数均满足非下降的条件,因此对于array[i-1]来说,它之前和它之后的数组均分别满足非下降的条件,对于array[i]亦是如此,所以,只需判断前后两段数组能否可以接成非下降的数组即可。具体来说,如果要修改的数是array[i-1],那么只需判断array[i-2]<=array[i]是否成立,同样的如果要修改array[i],那么应判断array[i-1]<=array[i+1]是否成立,当然如果array[i-1]或array[i]位于边界则直接成立。总结该算法:统计所有不满足非下降的相邻位置的个数count,如果count为0,则返回true(不用修改),若count大于1,则返回false,否则应进行进一步的判断:设不满足非下降的位置为i,array[i-1]>array[i],则最终返回true的条件为array[i-1]、array[i]为边界或者array[i-2]<=array[i]或者array[i-1]<=array[i+1]。时间复杂度为O(n),额外空间复杂度为O(1)。

Solution 1

#include <iostream>
#include <vector>
using namespace std; bool process(vector<int> &nums){
int n = nums.size();
int pos = , cnt = ;
for(int i = ; i < n; ++i){
if(nums[i- ] > nums[i]){
pos = i;
++cnt;
}
}
if(cnt == )
return true;
if(cnt > )
return false;
return pos == || pos == n - ||
nums[pos - ] <= nums[pos] ||
nums[pos - ] <= nums[pos + ];
}
int main(){
vector<int> nums;
int num;
while(scanf("%d", &num) != EOF){
nums.push_back(num);
}
cout << process(nums) << endl; return ;
}

【Google】非下降数组的更多相关文章

  1. HDU 6357.Hills And Valleys-字符串非严格递增子序列(LIS最长非下降子序列)+动态规划(区间翻转l,r找最长非递减子序列),好题哇 (2018 Multi-University Training Contest 5 1008)

    6357. Hills And Valleys 自己感觉这是个好题,应该是经典题目,所以半路选手补了这道字符串的动态规划题目. 题意就是给你一个串,翻转任意区间一次,求最长的非下降子序列. 一看题面写 ...

  2. Codeforces Round #323 (Div. 2) Once Again... CodeForces - 582B 最长非下降子序列【dp】(不明白)

    B. Once Again... time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  3. Educational Codeforces Round 97 (Rated for Div. 2) E. Make It Increasing(最长非下降子序列)

    题目链接:https://codeforces.com/contest/1437/problem/E 题意 给出一个大小为 \(n\) 的数组 \(a\) 和一个下标数组 \(b\),每次操作可以选择 ...

  4. 给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 ,返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况)

    """ #给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 #返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况) 解题思路: 1.设定一个 ...

  5. 给一个非矩形数组(Nonrectangular Arrays)

    Nonrectangular Arrays(非矩形数组)  public class Test {     public static void main(String[] args) {       ...

  6. POJ 3666 Making the Grade(数列变成非降序/非升序数组的最小代价,dp)

    传送门: http://poj.org/problem?id=3666 Making the Grade Time Limit: 1000MS   Memory Limit: 65536K Total ...

  7. Leetcode665.Non-decreasing Array非递减数组

    给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元素的情况下,该数组能否变成一个非递减数列. 我们是这样定义一个非递减数列的: 对于数组中所有的 i (1 <= i < n ...

  8. 斐波那契数列PHP非递归数组实现

    概念: 斐波那契数列即表达式为 a(n) = a(n-1)+a(n-2) 其中 a1 =0 a2 = 1  的数列 代码实现功能: 该类实现初始化给出n,通过调用getValue函数得出a(n)的值 ...

  9. 顺序表习题(1)-打印非递减数组a与b的升序并集(去除重复元素)

    void Print_Union(SqList a,SqList b) { , q = ; //初始化指针 ; //记录上一次打印的元素 while (p!=a.length&&q!= ...

随机推荐

  1. 用象棋的思维趣说IT人的职业发展和钱途

    最近我花了不少功夫在学习象棋,也学习了王天一等高手的棋路,感觉IT人的职业和下棋一样,往好了讲,争主动权争实惠只争朝夕,往坏了讲,一步走错得用多步来弥补,如果错误太大未必能弥补回来.在本文里,就用下棋 ...

  2. 使用tomcat7-maven-plugin部署Web项目

      一.环境准备 我使用的环境是:Window 10.Tomcat 8.0.36.maven3.tomcat7-maven-plugin 2.2版本. 二.设置环境变量 安装Tomcat8.0.36和 ...

  3. 【python】-- 函数、无参/有参参数、全局变量/局部变量

    函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函 ...

  4. springcloud zuul 使用zuulfilter 修改请求路径和响应头

    最近做项目有一个需求:一个网盘系统,文件存放在分布式文件系统中,之前的文件下载统一走的文件下载服务,现在需要在单文件下载的时候不需要走文件下载服务,而是直接访问文件系统上的路径,响应的时候修改响应头, ...

  5. php面向对象加载类

    php加载类: 新建php文件用驼峰法命名类名: 每个单词首字母大写,后面加.class.php表示这是php类文件.例如: ClubMember.class.php 若为纯php页面,<?ph ...

  6. 期刊搜索问题——SCI、EI、IEEE和中文期刊

    1.SCI.EI收录是什么意思? SCI和EI都是收录,并不是实体的期刊出版社,相当于具有高品质期刊出版社的合体(或统充),隔一段时间(几年或者几个月)SCI会进行评估,哪些出版社不具有被SCI收录的 ...

  7. Data Structure Linked List: Write a function to reverse a linked list

    iterative太简单不写了 http://www.geeksforgeeks.org/write-a-function-to-reverse-the-nodes-of-a-linked-list/ ...

  8. 【leetcode刷题笔记】Divide Two Integers

    Divide two integers without using multiplication, division and mod operator. 题解:要求不用乘除和取模运算实现两个数的除法. ...

  9. Android 双u盘方案【转】

    本文转载自:https://blog.csdn.net/kc58236582/article/details/49618445 1      L1813系统上双U盘设计方案——系统设计 1.1     ...

  10. 修改SecureCRT终端的Home和End功能键

    SecureCRT真是个不错的ssh客户端工具,但在使用时发现跟自己的一些使用习惯不符合,例如home.end.pageup.pagedown和delete等键.默认情况下一些按键的功能如下:page ...