翻转数组

来源:互联网 发布: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
原创粉丝点击