转自九章算法公众号

题目描述

给出包含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. 九度OJ 1337:寻找最长合法括号序列 (DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:839 解决:179 题目描述: 给你一个长度为N的,由'('和')'组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的 ...

  2. DNN自适应

  3. [note]BSGS & exBSGS

    BSGS (感觉这东西还是要写一下) BSGS主要用于求解形如\(x^k=y\pmod p\)(注意这里p与x互质)这样的方程的最小正整数解的问题 设\(m=\lceil\sqrt p\rceil,k ...

  4. Django 视图之CBV

    CBV 所谓的CBV(class base view) 在视图里面,用类的方式来写逻辑 那么对于FBV,CBV有什么优势? CBV(class base views) 就是在视图里使用类处理请求. P ...

  5. Android Interactive Animation

    Ref:收集android上开源的酷炫的交互动画和视觉效果:Interactive-animation Ref:界面特效 Ref:BaseAnimation是基于开源的APP,致力于收集各种动画效果( ...

  6. IntelliJ IDEA(2017)安装和破解(转发)

    IntelliJ IDEA(2017)安装和破解 IDEA 全称 IntelliJ IDEA,是Java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手 ...

  7. SpringBoot学习笔记(4):与前端交互的日期格式

    SpringBoot学习笔记(4):与前端交互的日期格式 后端模型Date字段解析String 我们从前端传回来表单的数据,当涉及时间.日期等值时,后端的模型需将其转换为对应的Date类型等. 我们可 ...

  8. Thread.currentThread().getContextClassLoader() and Class.getClassLoader()

    Thread.currentThread().getContextClassLoader() and Class.getClassLoader()   一.同一工程中: String path = T ...

  9. Docker dockerfile命令详解

    docker-file 官网文档:https://docs.docker.com/v17.09/engine/reference/builder/ 制作Dockerfile为Docker入门学习的第一 ...

  10. HDU 1800 Flying to the Mars 字典树,STL中的map ,哈希树

    http://acm.hdu.edu.cn/showproblem.php?pid=1800 字典树 #include<iostream> #include<string.h> ...