魔术索引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; } };
相关文章推荐
- Leetcode:26. Remove Duplicates from Sorted Array(JAVA)
- android Material Design (材质设设计)
- 86. Partition List LeetCode
- UDP是什么、及UDP和TCP的区别?
- 【遗留----2016.03.07】
- 第5章 jQuery之事件
- iOS多线程之pthread
- LC76 Minimum Window Substring
- HTTP请求与响应
- Linux系统平均负载3个数字的含义
- Servlet 工作原理解析
- 毕业设计第二十天
- 杭电1200
- 5分钟搞懂后缀数组
- 在Android开发中遇到java.lang.NoClassDefFoundError的一般解决办法
- jsp(Java Server Pages)和js(JavaScript)的区别:
- codeforces 651B B. Beautiful Paintings
- CGRect转为string
- 4. PathVariable、RequestParam、 CookieValue、SessionAttributes、ResponseBody、RequestHeader注解类
- 1008. Elevator (20)