在数组A中找出一个魔术索引

public static int magicSlow(int[] array)

{

for(int i=0;i<array.length;i++)

{

if(array[i]==i)

{

return i;

}

}

return -1;

}

public static int magicFast(int [] array,int start,int end)

{

if(end<start||start<0||end>array.length){

return -1;

}

int mid=(start+end)/2;

if(array[mid]==mid)

return mid;

else if(array[mid]>mid)

{

return magicFast(array,start,mid-1);

}else

{

return magicFast(array,mid+1,end);

}

}

public static int magicFast(int[] array)

{

return magicFast(array,0,array.length-1);

}

public static int magicFast(int[] array,int start,int end)

{

if(end<start || start<0||end>=array.length)

{

return -1;

}

int midIndex=(start+end)/2;

int midValue=array[midIndex];

if(midValue==midIndex)

{

return midIndex;

}

/*

搜索左半部分

*/

int leftIndex=Math.min(midIndex-1,midValue);

int left=magicFast(array,start,leftIndex);

if(left>=0)

return left;

/*

搜索右半部分

*/

int rightIndex=Math.max(midIndex+1,midValue);

int right=magicFast(array,rightIndex,end);

return right;

public static int magicFast(int[] array)

{

return magicFast(array,0,array.length-1);

}

}

注:如果数组元素各不相同,这个方法的执行动作与第一个解法几近相同。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 23:06:37

在数组A中找出一个魔术索引的相关文章

一组数据中找出一个唯一出现过一次的数字

利用同一数字的异或为0的关系,创建了一个函数 #include<stdio.h> #include<stdlib.h> int Fac(int n, int a[10])//创建异或函数 { //相等的数字异或之后就成0了 int temp = 0;//必须先初始化0,或a[0] int i; for (i = 0; i < n; i++) { temp ^= a[i]; } return temp; } int main() { int i, n; int ret; int

程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定Sum= 10 1,5,6,7,8,9 给定Sum= 10 分析与解法 这个题目不是很难,也很容易理解.但是要得出高效率的解法,还是需要一番思考的. 解法一 一个直接的解法就是穷举:从数组中任意取出两个数字,计算两者之和是否为给定的数字. 显然其时间复杂度为N(N-1)/2即O(N^2).这个算法很简

算法题:找出一个数组中依次最大的k个元素

package arithmetic; import java.util.Arrays; /** * 找出一个数组中依次最大的k个元素 * @author SHI */ public class FindMaxFigure { public static void main(String[] args) { int[] a=new int[]{1,5,-1,8,0,2}; System.out.println(Arrays.toString(findBigFigure(a, 3))); } /*

面试题1:找出一个数组中三个只出现一次的数字

version1: 找出一个数组中一个只出现一次的数字,其他数字都出现两次:将所有数字异或,得到的结果即为只出现一次的. version2: 找出一个数组中两个只出现一次的数字,其他数字都出现两次:将所有数字异或,得到的结果即为x=a^b, index为x中第一个为1的位,则a 和b中第index为必然有一个为1,有一个为0.据此将所有数据分为两组,一组的第index为都为1,另一组第index为都为0,第一组数字异或得到a,第二组数字异或得到b. 时间复杂度为o(n),空间复杂度为o(1).

1152: 零起点学算法59——找出一个数组中出现次数最多的那个元素

1152: 零起点学算法59--找出一个数组中出现次数最多的那个元素 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 990  Accepted: 532[Submit][Status][Web Board] Description 找出一个数组中出现次数最多的那个元素 Input 第一行输入一个整数n(不大于20) 第二行输入n个整数 多组数据 Output 找出n个整数中出现次数最多的那个整数(

刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数

今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的题.去发现问题. 题目:     给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 解析: 实际这里就是给你的一个列表的数字,给你一个预期,让你返

[面试题]在数组中找出3个数使得它们和为0

给定一个数组S,试找出3个数a, b, c,使得a+b+c=0.也即从集合中找出所有的和为0的3个数. 例如:集合S={-1,0, 1, 2, -1, 4},则满足条件的3个数有2对:(-1, 0, 1)和(-1, 2, -1).注意(-1,1,0)与(-1,0,1)算同一个解,所以不用重复考虑. 当然该例子集合的解也可以写成:(0, 1, -1)和(2, -1, -1). 参考了:http://blog.csdn.net/wangran51/article/details/8858398,他给

笔试题--在一个整数数组中找出第5大的数

/** * 在一个整数数组中找出第5大的数 * 思路是首先在数组中找到最小数,然后依次找到第五大的数 * * @param array * @return */ public static int[] selectionSort(int[] array) { if (array.length == 0) return array; for (int i = 0; i < array.length; i++) { int minIndex = i; for (int j = i; j < arr

给出一个数组A,找出一对 (i, j)使得A[i] &lt;= A[j] (i &lt; j)并且j-i最大

题目:给出一个数组A,找出一对 (i, j)使得A[i] <= A[j] (i <= j)并且j-i最大 ,若有多个这样的位置对,返回i最小的那一对. 最直接的想法就是对于每一个 i 从数组最尾端开始向前找到第一个大于等于 A[i] 的位置 j ,时间复杂度O(n^2). 1. pair<int, int> find(const vector<int> &A) 2. { 3. int n = A.size(); 4. if(n == 0) 5. throw ne