面试题 08.03. 魔术索引

题目

我的思路

思路一是从小到大遍历有序序列,,当前元素如果小于它的下标并且下标那么继续遍历下一个元素;如果当前元素大于它的下标,那么可以直接跳到往后数第(当前元素-下标)个元素继续比较;直到匹配或者超出数组的界限。
 
官方题解有另一个思路,借助二分法。

每次我们选择数组的中间元素,如果当前中间元素是满足条件的答案,那么这个位置往后的元素我们都不再考虑,只要寻找左半部分是否有满足条件的答案即可。

否则我们需要查看左半部分是否有满足条件的答案,如果没有的话我们仍然需要在右半边寻找,使用的策略同上。

我的实现

class Solution {
public:
    int findMagicIndex(vector<int>& nums) {
        //哨兵
        nums.push_back(nums.size());
        int length = nums.size();
        int index=0;
        while(nums[index]!=index){
            if(nums[index]<index){
                ++index;
            }else{
                index=nums[index];
                if(index>=nums.size())
                break;
            }
        }
        if(index>=length)return -1;
        return index;
    }
};
/*

思路一是从小到大遍历有序序列,,当前元素如果小于它的下标并且下标那么继续遍历下一个元素;如果当前元素大于它的下标,那么可以直接跳到往后数第(当前元素-下标)个元素继续比较;直到匹配或者超出数组的界限
*/

拓展学习

 
原文地址:https://www.cnblogs.com/BoysCryToo/p/13408812.html