2014-03-20 03:01

题目:给定一个已按升序排序的数组,找出是否有A[i] = i的情况出现。

解法1:如果元素不重复,是可以严格二分查找的。

代码:

 // 9.3 Given a unique sorted array, find a position where A[i] = i, if one exists.
#include <cstdio>
#include <vector>
using namespace std; int main()
{
vector<int> v;
int n;
int i;
int ll, rr, mm; while (scanf("%d", &n) == && n > ) {
v.resize(n);
for (i = ; i < n; ++i) {
scanf("%d", &v[i]);
}
if (v[] > || v[n - ] < n - ) {
mm = -;
} else {
ll = ;
rr = n - ;
while (ll <= rr) {
mm = (ll + rr) / ;
if (v[mm] < mm) {
ll = mm + ;
} else if (v[mm] > mm) {
rr = mm - ;
} else {
break;
}
}
if (ll > rr) {
mm = -;
}
}
printf("%d\n", mm); v.clear();
} return ;
}

解法2:如果元素可能存在重复,那么会出现无法确定答案在左边还是右边的时候。比如{-1, 3, 3, 3, 3},后面的连续4个‘3’中有A[i]<i,有A[i]>i,也有A[i]=i的。这种情况下就得两边都进行查找了。在没有重复的时候,还是可以二分的,因此总体复杂度介于O(log(n))和O(n)之间,依数据好坏而变。

代码:

 // 9.3 Given a sorted array, find a position where A[i] = i, if one exists. The array may have duplicates.
#include <cstdio>
#include <vector>
using namespace std; int findMagicIndex(vector<int> &v, int start, int end)
{
if (start > end || start > (int)v.size() - || end < ) {
return -;
}
int mid = (start + end) / ;
if (v[mid] == mid) {
return mid;
} int res = findMagicIndex(v, start, (mid - < v[mid] ? mid - : v[mid]));
if (res >= ) {
return res;
}
res = findMagicIndex(v, (mid + > v[mid] ? mid + : v[mid]), end);
return res;
} int main()
{
vector<int> v;
int n;
int i; while (scanf("%d", &n) == && n > ) {
v.resize(n);
for (i = ; i < n; ++i) {
scanf("%d", &v[i]);
}
printf("%d\n", findMagicIndex(v, , n - )); v.clear();
} return ;
}

最新文章

  1. Thread与Runnable的一个小陷阱
  2. svm训练显示信息说明
  3. jquery,php之间的ajax关系以及json
  4. MySQL中varchar转int
  5. 在 MySQL 中查找含有目标字段的表
  6. cell的imageVIew的fram问题
  7. Android绘图之渐隐动画
  8. $.getJSON ashx 跨域
  9. html+css-水平居中-不定款块状元素方法(二)
  10. 【转】iPhone 6 屏幕揭秘
  11. [Ramda] Compose and Curry
  12. [转载][记录]javascript生成不重复的随机数
  13. ZOJ3582:Back to the Past(概率DP)
  14. iOS开发-OC语言 (五)字典
  15. MySQL缓存之Qcache与buffer pool对比
  16. tyvj4877 组合数
  17. [原创]K8uac bypassUAC(Win7/Wi8/Win10) 过46款杀软影响所有Windows版本
  18. scapy学习笔记(3)发送包,SYN及TCP traceroute 扫描
  19. win7系统自带分区工具,能分出逻辑分区
  20. gradle项目,连同依赖一起打jar包

热门文章

  1. MySql 8.0.11 在win10下的zip非安装配置
  2. 笨办法学Python(二十一)
  3. 笨办法学Python(七)
  4. C++ POD类型
  5. java集合框架——Set
  6. 一种轻量级的C4C业务数据同步到S4HANA的方式:Odata通知
  7. 119. Pascal&#39;s Triangle II (Amazon) from leetcode
  8. 后缀数组入门(二)——Height数组与LCP
  9. LA 2957 最大流,最短时间,输出路径
  10. BestCoder Round #89 1001 Fxx and string