给定一个数组 A,如果 某个下标 i, 满足 A[i] = i, 则 i 称为 Magic Index。

现在假设 A 中的元素是递增有序的、且不重复,找出 Magic Index.

更进一步,当数组中有重复的元素呢??

分析:

首先题目不难。

最简单的当然是 扫描一遍数组,当然这个 O(N)的算法不是最优的。

进一步思考,如今数组是递增的,可否采用 二分搜索,从而加速到 O(lgN)?

   if  a[mid] == mid,  return mid;

   if  a[mid]  <  mid,  search in range[mid+1,  right];  

Why? 左半部分一定不会有 Magic index。 反证法: 假如左半部分存在一个 K 是Magic index, 则 a[K] = K.

        由于没有重复的元素,所以数组元素从左到右递增的时候,每次增加至少是 1。

       从而有 a[mid] > a[K] + mid-K > K + mid - K = mid, 得到矛盾。

   if  a[mid]  > mid,   search in range[left, mid-1];



考虑下面的一个例子:

index:      0    1    2    3    4    5     6

value:    -10   -5   1    2    4   10   12

a[mid] = 2 < mid = 3, 继续在右半部分找即可,。

二、假设存在重复的元素

由于存在重复的元素,所以数组元素从左到右递增的时候,每次增加不一定大于1了, 有可能是 0。

二分搜索不再使用。每次都必须对 左,右两半都进行搜索。

但是这里还是有一个小 trick,

如果 a[mid] < mid, 左边仅需要搜索 (left,     a[mid]), 右边还是搜索 (mid+1, right).

如果 a[mid] > mid, 右边仅需要搜索 (a[mid],  right), 左边还是搜索 (left, mid-1).

拿个例子来说明:

index:      0    1    2    3    4    5     6

value:    -10   1    1    1   6   10   12

mid = 1 < a[mid] = 3

// copyright @ L.J.SHOU Feb.22, 2014
// magic index
#include <iostream>
using namespace std; // if found, return index;
// if not found, return -1;
int MagicIndex(int A[], int left, int right)
{
int index(-1); if(left <= right)
{
int mid = left + ((right - left) >> 1); if(A[mid] == mid) return mid;
else if(A[mid] < mid){
index = MagicIndex(A, left, A[mid]);
if(index != -1) return index; index = MagicIndex(A, mid+1, right);
if(index != -1) return index;
}
else{
index = MagicIndex(A, left, mid-1);
if(index != -1) return index; index = MagicIndex(A, A[mid], right);
if(index != -1) return index;
}
} return -1;
}

算法----Magic Index的更多相关文章

  1. [CareerCup] 9.3 Magic Index 魔法序号

    9.3 A magic index in an array A[0.. .n-1] is defined to be an index such that A[i] = i. Given a sort ...

  2. [8.3] Magic Index

    A magic index in an array A[0...n-1] is defined to be an index such that A[i] = i. Given a sorted ar ...

  3. 数组Magic Index

    Question A magic index in an array A[1...n-1] is defined to be an index such that A[i] = i. Given a ...

  4. Magic Index 寻找数组中A[i]=i的位置(原题转自微信号待字闺中)

    有一个有意思的题目叫做Magic Index:给定一个数组A,其中有一个位置被称为Magic Index,含义是:如果i是Magic Index,则A[i] = i.假设A中的元素递增有序.且不重复, ...

  5. 待字闺中之Magic Index 分析

    给定一个数组A,当中有一个位置被称为Magic Index,含义是:如果i是Magic Index.则A[i] = i. 如果A中的元素递增有序.且不反复,请给出方法,找到这个Magic Index. ...

  6. The Aggregate Magic Algorithms

    http://aggregate.org/MAGIC/ The Aggregate Magic Algorithms There are lots of people and places that ...

  7. 字符串匹配(二)----KMP算法

    什么是KMP算法: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法).KMP ...

  8. MySQL联接查询算法(NLJ、BNL、BKA、HashJoin)

    一.联接过程介绍 为了后面一些测试案例,我们事先创建了两张表,表数据如下:   1 2 3 4 CREATE TABLE t1 (m1 int, n1 char(1)); CREATE TABLE t ...

  9. BF算法和KMP算法 python实现

    BF算法 def Index(s1,s2,pos = 0): """ BF算法 """ i = pos j = 0 while(i < ...

随机推荐

  1. [bootstrap] 基本css样式和组件

    一.基本css样式 01.全局设置 全局 font-size 是 14px,line-height 是 20px. 这些样式应用到了 <body> 和所有的段落上. 另外,对 <p& ...

  2. java中的if-Switch选择结构

    字随笔走,笔随心走,随笔,随心.纯属个人学习分析总结,如有观者还请不啬领教. 1.if选择结构 什么是if结构:if选择结构是根据判断结果再做处理的一种语法结构. 起语法是: if(判断条件){ 操作 ...

  3. PHP可变长函数方法介绍

    1.三个重要函数 func_num_args()  返回实参个数 func_get_arg(i)    返回某个实参的值       func_get_args()        以数组的形式返回实参 ...

  4. 一些git命令

    git push --set-upstream origin release  强制将add的数据提交到  release分支.

  5. 如何获得bin/Debug目录的路径?

    这个可以使用下面的方法 答案:bin目录:通过应用程序集合AppDomain.CurrentDomain.BaseDirectory:带有"\"System.Environment ...

  6. 转载——PLSQL developer 连接不上64位Oracle 解决办法

    前两天刚下载了oracle 11g 64位的最新版本,安装成功之后,再安装PLSQL.结果使用PLSQL访问数据库时,死活连接不上.报错如下: Could not load "……\bin\ ...

  7. 统计类别数量并且使用pyplot画出柱状图

    从数据库中读取数据,具体操作为: # -*- coding: utf-8 -*- from numpy import * import numpy as np import pandas as pd ...

  8. Android动画效果生动有趣的通知NiftyNotification(Android Toast替代品)

    NiftyNotification在github上的项目主页是:https://github.com/sd6352051/NiftyNotification NiftyNotification本身又依 ...

  9. 二模 (5)day1

    第一题: 题目大意:解一元一次方程(只有+-符号): 解题过程:直接处理处两边的x的系数和常数项,字符串的处理即可. 第二题: 题目大意:求逆序对数. 解题过程:直接归并排序. 第三题: 题目大意:多 ...

  10. BPM与OA,选择好烦恼!

    企业在信息化建设的过程中 难免遭遇BPM和OA之争, 难!难!难! 选择BPM吧, 有人觉得你“打肿脸充胖子”: 选择OA嘛, “行业大哥”们已经在BPM的路上越走越远… 其实, OA和BPM从某种意 ...