您的位置:首页 > 其它

魔术索引1

2016-03-07 22:38 363 查看

题目描述

在数组A[0..n-1]中,有所谓的魔术索引,满足条件A[i]=i。给定一个升序数组,元素值各不相同,编写一个方法,判断在数组A中是否存在魔术索引。请思考一种复杂度优于o(n)的方法。

给定一个int数组A和int n代表数组大小,请返回一个bool,代表是否存在魔术索引。

测试样例:

[1,2,3,4,5]

返回:false

解答

暴力法

class MagicIndex {
public:
bool findMagicIndex(vector<int> A, int n) {
// write code here
for(int i = 0;i<n;++i)
if(A[i] == i)
return true;

return false;
}
};


根据数据特点,利用二分查找的思想

  给定的数组是有序的

  这个问题域经典的二分查找非常相似。在二分查找中,要找出元素k,我们会先拿它跟数组中间的元素x比较,确定k是位于x的左边还是右边。

  以此为基础,是否可以通过检查中间元素来确定魔术索引的位置?

  


  以上面的数组为例,看到中间元素A[5] = 3,由于A[mid] < mid那么我们可以确定魔术索引一定在数组的右侧。

  这是因为从索引i移至i-1时,索引对应的数值至少要减少1,也有可能更多(因为数组是有序的,而且元素各不相同)。因此,如果中间元素就已经太小,那么往左侧移动时,索引减少k,对应的数值也至少减k。

class MagicIndex {
public:
bool findMagicIndex(vector<int> A, int n) {
// write code here
return findMagicIndexCore(A,0,A.size()-1) == -1?false:true;

}

int findMagicIndexCore(vector<int> A,int start,int end)
{
if(end<start || start < 0 || end>=A.size())
return -1;
int mid = (start+mid)/2;
if(A[mid] == mid)
return mid;
else if(A[mid] < mid)
return findMagicIndexCore(A,mid+1,end);
else
return findMagicIndexCore(A,start,mid-1);
}
};


class MagicIndex {
public:
bool findMagicIndex(vector<int> A, int n) {
// write code here
if(A.empty())
return false;
int l = 0;
int u = n-1;
while(l <= u)
{
int m = l + (u - l)/2;
if(A[m] == m)
return true;
else if(A[m] < m)
l = m+1;
else
u = m-1;
}
return false;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: