【Google】非下降数组
转自九章算法公众号
题目描述
给出包含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】非下降数组的更多相关文章
- HDU 6357.Hills And Valleys-字符串非严格递增子序列(LIS最长非下降子序列)+动态规划(区间翻转l,r找最长非递减子序列),好题哇 (2018 Multi-University Training Contest 5 1008)
6357. Hills And Valleys 自己感觉这是个好题,应该是经典题目,所以半路选手补了这道字符串的动态规划题目. 题意就是给你一个串,翻转任意区间一次,求最长的非下降子序列. 一看题面写 ...
- 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 ...
- Educational Codeforces Round 97 (Rated for Div. 2) E. Make It Increasing(最长非下降子序列)
题目链接:https://codeforces.com/contest/1437/problem/E 题意 给出一个大小为 \(n\) 的数组 \(a\) 和一个下标数组 \(b\),每次操作可以选择 ...
- 给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 ,返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况)
""" #给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 #返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况) 解题思路: 1.设定一个 ...
- 给一个非矩形数组(Nonrectangular Arrays)
Nonrectangular Arrays(非矩形数组) public class Test { public static void main(String[] args) { ...
- POJ 3666 Making the Grade(数列变成非降序/非升序数组的最小代价,dp)
传送门: http://poj.org/problem?id=3666 Making the Grade Time Limit: 1000MS Memory Limit: 65536K Total ...
- Leetcode665.Non-decreasing Array非递减数组
给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元素的情况下,该数组能否变成一个非递减数列. 我们是这样定义一个非递减数列的: 对于数组中所有的 i (1 <= i < n ...
- 斐波那契数列PHP非递归数组实现
概念: 斐波那契数列即表达式为 a(n) = a(n-1)+a(n-2) 其中 a1 =0 a2 = 1 的数列 代码实现功能: 该类实现初始化给出n,通过调用getValue函数得出a(n)的值 ...
- 顺序表习题(1)-打印非递减数组a与b的升序并集(去除重复元素)
void Print_Union(SqList a,SqList b) { , q = ; //初始化指针 ; //记录上一次打印的元素 while (p!=a.length&&q!= ...
随机推荐
- Jmeter 04 JMeter 负载与监听
1. 场景设计 2. 场景设置 3. JMeter性能参数配置 4. 测试监听
- 【BZOJ3168】[Heoi2013]钙铁锌硒维生素 高斯消元求矩阵的逆+匈牙利算法
[BZOJ3168][Heoi2013]钙铁锌硒维生素 Description 银河队选手名单出来了!小林,作为特聘的营养师,将负责银河队选手参加宇宙比赛的饮食.众所周知,前往宇宙的某个星球,通常要花 ...
- Ubuntu 12.04使用uginx+fastcgi-mono-server2部署asp.net 网站
Ubuntu 12.04使用uginx+fastcgi-mono-server2部署asp.net 网站 1.安装nginx和mono-fastcgi-server2 sodu apt-get in ...
- 记录-spring MultipartFile 文件上传
注意:以下上传和下载方法未必完全正确,不同浏览器效果不同,建议不要使用IE /** * 简单的文件上传 * @author:qiuchen * @createTime:2012-6-19 * @par ...
- Convex combination
en.wikipedia.org/wiki/Convex_combination 凸组合 In convex geometry, a convex combination is a linear co ...
- 从内存中加载并启动一个exe
windows似乎只提供了一种启动进程的方法:即必须从一个可执行文件中加载并启动.而下面这段代码就是提供一种可以直接从内存中启动一个exe的变通办法.用途嘛, 也许可以用来保护你的exe,你可以对要保 ...
- 5.Django数据库配置
Django默认支持sqlite.mysql.oracle.postgresql数据库,像db2和sqlserver需要安装第三方的支持 配置Django数据库:\hello_django\hello ...
- Yii2发送短信验证码完全解决方案
概述 在做项目的时候,需要用到短信发送验证码功能.不能不说Yii2的牛逼,很容易就搞定了.下面我整理一下具体功能和流程,分享给大家. 主要功能 通过Yii2 rules验证手机号 通过js验证是否为手 ...
- python3.7.1 内置函数
python3.7.1 内置函数列表 内置函数 abs() delattr() hash() memoryview() set() all() dict() help() min() setattr( ...
- 【leetcode刷题笔记】Word Search
Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...