1. 程式人生 > 實用技巧 >面試題 08.03. 魔術索引 - 7月31日

面試題 08.03. 魔術索引 - 7月31日

題目

我的思路

思路一是從小到大遍歷有序序列,,當前元素如果小於它的下標並且下標那麼繼續遍歷下一個元素;如果當前元素大於它的下標,那麼可以直接跳到往後數第(當前元素-下標)個元素繼續比較;直到匹配或者超出陣列的界限。 官方題解有另一個思路,藉助二分法。

每次我們選擇陣列的中間元素,如果當前中間元素是滿足條件的答案,那麼這個位置往後的元素我們都不再考慮,只要尋找左半部分是否有滿足條件的答案即可。

否則我們需要檢視左半部分是否有滿足條件的答案,如果沒有的話我們仍然需要在右半邊尋找,使用的策略同上。

我的實現

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; } }; /* 思路一是從小到大遍歷有序序列,,當前元素如果小於它的下標並且下標那麼繼續遍歷下一個元素;如果當前元素大於它的下標,那麼可以直接跳到往後數第(當前元素-下標)個元素繼續比較;直到匹配或者超出陣列的界限 */

拓展學習

分類:每日壹題