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

    拓展学习

     
  • 相关阅读:
    C#读取并修改app.congig的实例
    apache:添加cgi模式
    初识golang
    Golang: pprof
    Golang:测试map是否存在
    beego: 获取request参数
    shell:crontab
    初识Iaas,paas
    初识golang
    Go-new和make
  • 原文地址:https://www.cnblogs.com/BoysCryToo/p/13408812.html
Copyright © 2020-2023  润新知