C++ 魔术索引2

#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值