魔術索引II

  • 在數組A[0..n-1]中,有所謂的魔術索引,知足條件A[i]=i。給定一個不降低序列,元素值可能相同,編寫一個方法,判斷在數組A中是否存在魔術索引。請思考一種複雜度優於o(n)的方法。 給定一個int數組A和int n表明數組大小,請返回一個bool,表明是否存在魔術索引。
  • 測試例子以下所示:[1,1,3,4,5], 返回:true
//首先應該注意的是不過mid是否大於或者小於arr[mid],魔數都有可能出如今左邊或者右邊代碼以下
import java.util.*;
public class MagicIndex {
    public boolean findMagicIndex(int[] A, int n) {
		if(n == 0) return false;
        return findMagic(A, 0, n - 1);
    }
    public boolean findMagic(int [] A, int start ,int end){
        if(start > end)
            return false;
        int mid = (start + end)/2;
        if(A[mid] == mid)
            return true;
        return findMagic(A, start, mid - 1) || findMagic(A, mid + 1, end);
    }
}

一種更好的方案是下面這種方法java

  • 應該是從i:0~n - 1進行遍歷,若是當前A[i] == i,返回true;若是A[i] < i, 則i ++;若是A[i] > i,則令i = A[i],即跳過A[i] - i個元素(由於序列是非遞減的,因此A[i] > i時,至少到i = A[i]處,纔有可能出現A[i] == i)。
  • 例如2, 2, 2, 4, 5序列,i == 0時,A[i] = 2,則應跳過i = 1,直接比較i = 2處。
  • 代碼以下所示:
class MagicIndex {
public:
    bool findMagicIndex(vector<int> A, int n) {
        // write code here
        if(0 == n)
            return true;
        int i;
        for(i = 0; i < n;)
            {
            if(A[i] == i)
                return true;
            else
                if(A[i] < i)
                i ++;
            else
                i = A[i];
        }
        return false;
    }
};
相關文章
相關標籤/搜索