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

    拓展学习

     
  • 相关阅读:
    Java检测文件是否UTF8编码
    Linux: uid/euid/suid的关系
    位移运算
    Springmvc 重定向参数传递方式
    @RequestBody和@RequestParam区别
    jsp页面老提示Multiple annotations found at this line:
    滚动表格代码
    滚动条样式修改
    WebService的四种客户端调用方式
    table元素的td和ul元素li隔行变色
  • 原文地址:https://www.cnblogs.com/BoysCryToo/p/13408812.html
Copyright © 2011-2022 走看看