翻转数组是这样的一类问题:
即将 某一个数组的局部翻转后, 使得整体数组有序。以升序为例。
我的思考是将数组分为三段: 引入 左指针,右指针;其中,左指针往右推送,直至不再升序退出,右指针往左推送,直至不再降序时退出。
最后 从左指针 到 右指针 之间的值 断言是否为 降序。
算法如下:
#include<iostream>
using namespace std;
int main(){
int len=0;
cin>>len;
int* array = new int[len];
for(int i=0;i<len;i++){
cin>>array[i];
}
int l=0,r=len-1;
while(l<r){
if(array[l]<array[l+1]) l++;
else break;
}
while(r>l){
if(array[r]>array[r-1]) r--;
else break;
}
if(l>=r){
cout<<"no"<<endl;
delete array;
return 0;
}else{
while(l<r){
if(array[l] >array[l+1] ) l++;
else break;
}
}
if(l==r) cout<<"yes"<<endl;
else cout<<"no"<<endl;
delete array;
return 0;
}
但是,我提交测试用例的时候,通过率只有80%,不知道为什么。鉴于自己是个算法方面的小白,剩下的20%就放过自己。 并且,在未通过的那个测试用例,我直观来看,确实是符合翻转数组的要求的,不知道为什么。