翻转数组
来源:互联网 发布:tensorflow graph 编辑:程序博客网 时间:2024/04/28 12:11
题目地址
http://exercise.acmcoder.com/online/online_judge_ques?ques_id=1656&konwledgeId=134
题目描述
给定一个长度为n的整数数组a,元素均不相同,问数组是否存在这样一个片段,只将该片段翻转就可以使整个数组升序排列。其中数组片段[l,r]表示序列a[l], a[l+1], …, a[r]。原始数组为
a[1], a[2], …, a[l-2], a[l-1], a[l], a[l+1], …, a[r-1], a[r], a[r+1], a[r+2], …, a[n-1], a[n],
将片段[l,r]反序后的数组是
a[1], a[2], …, a[l-2], a[l-1], a[r], a[r-1], …, a[l+1], a[l], a[r+1], a[r+2], …, a[n-1], a[n]。
解题思路
首先将数据读取进数组,然后遍历数组,得到逆序子序列的开始和结束位置。
start记录逆序子序列的开始位置,end记录逆序子序列的结束位置。
由遍历过程可知,map[start]到map[end]是递减的,因此翻转之后必然是递增的。
我们只需要验证:
(1) map[start-1]与map[end]的大小关系,如果start-1为负数则无需验证。
(2) map[end+1]与map[start]的大小关系,如果end+1>n-1则无需验证。
以上验证通过,输出yes,否则输出no。
代码
#include<iostream>using namespace std;int map[100000];int main(){ int n; while(cin>>n){ int start=-1,end=-1,k=0,flag[2]={0}; for(int i=0;i<n;i++){ cin>>map[i]; } for(int i=0;i<n-1;i++){ if(map[i] > map[i+1]){ if(k==0){ start = i; } k++; }else{ if(k!=0){ end = i; break; } } } if(start>0){ if(map[start-1]<map[end]){ flag[0] = 1; }else{ flag[0] = 0; } }else if(start==0){ flag[0] = 1; } if(end<n-1){ if(map[start]<map[end+1]){ flag[1] = 1; }else{ flag[1] = 0; } }else if(end==n-1){ flag[1] = 1; } if(flag[0] && flag[1]){ cout<<"yes"<<endl; }else{ cout<<"no"<<endl; } } return 0;}
0 0
- 数组翻转
- 翻转数组
- 翻转数组
- 翻转数组
- 翻转数组
- 翻转数组
- 翻转数组
- 翻转数组
- 翻转数组
- 翻转数组
- 翻转数组
- 翻转数组
- 翻转数组
- 数组翻转
- 翻转数组
- 翻转数组
- 数组翻转
- [算法]翻转数组
- Hadoop入门-2.HDFS原理和工作机制(基于hadoop-2.7.3)
- 宣传片能为企业带来哪些改变?
- java关键字
- 蓝牙音频A2DP(二) -- audio_hw_device结构体
- 安卓四大程序组件+Intent讲解
- 翻转数组
- 防线Defense Lines
- 安卓开发者选项菜单里的动画选项都代表什么含义?
- Apache服务以及httpd.conf配置详解
- vim插件安装
- SQL基本操作
- Android CoordinatorLayout + AppBarLayout(向上滚动隐藏指定的View)
- 【小米澎湃 S1 芯片、小米5c 发布】
- 利用View自身的方法实现倒计时功能