#include<iostream>
using namespace std;
#include<vector>
/**
在数组A[0..n-1]中,有所谓的魔术索引,满足条件A[i]=i。
给定一个不下降序列,元素值可能相同,编写一个方法,
判断在数组A中是否存在魔术索引。请思考一种复杂度优于o(n)的方法。
给定一个int数组A和int n代表数组大小,
请返回一个bool,代表是否存在魔术索引。
当数组变为不下降序列时,允许数组中出现重复的元素
则使用原始的二分法将会失效
但是可以限定搜索的区间
(1)如果A[i]大于i,则搜索区间为整个左半部分区间和右半部分的A[A[i]:]
(2)如果A[i]小于i,则搜索区间为整个右半部分区间和左半部分区间的局部A[0:A[i]]
**/
class MagicIndex {
public:
bool findMagicIndex(vector<int> A, int n) {
// write code here
// 使用递归形式的二分法
if(n==0){
return false;
}
if(n==1){
if(A[0]==0){
return true;
}
else{
return false;
}
}
else{
if(n%2==0){
n=int(n/2);
}
else{
n=int(n/2)+1;
}
if(A[n]==n){
return true;
}
else{
if(A[n]>n){
vector<int> b;
for(int i=A[n];i<A.size();i++){
b.push_back(A[i]);
}
vector<int> c;
for(int k=0;k<n;k++){
c.push_back(A[k]);
}
if(this->findMagicIndex(b,b.size())==true){
return true;
}
else{
return this->findMagicIndex(c,c.size());
}
}
else{
vector<int> b;
for(int i=0;i<A[n];i++){
b.push_back(A[i]);
}
vector<int> c;
for(int k=n+1;k<A.size();k++){
c.push_back(A[k]);
}
if(this->findMagicIndex(b,b.size())==true){
return true;
}
else{
return this->findMagicIndex(c,c.size());
}
}
}
}
}
};
int main(){
vector<int> a;
a.push_back(1);
a.push_back(1);
a.push_back(3);
a.push_back(5);
a.push_back(6);
MagicIndex helper;
cout<<helper.findMagicIndex(a,5)<<endl;
return 0;
}