程序员面试金典(排序与查找):元素查找(java解法)

题目描述

有一个排过序的数组,包含n个整数,但是这个数组向左进行了一定长度的移位,例如,原数组为[1,2,3,4,5,6],向左移位5个位置即变成了[6,1,2,3,4,5],现在对于移位后的数组,需要查找某个元素的位置。请设计一个复杂度为log级别的算法完成这个任务。

给定一个int数组A,为移位后的数组,同时给定数组大小n和需要查找的元素的值x,请返回x的位置(位置从零开始)。保证数组中元素互异。

测试样例:
[6,1,2,3,4,5],6,6
返回:0
import java.util.*;

public class Finder {
    public int findElement(int[] A, int n, int x) 
    {
        int res = search(A,0,n-1,x);
        return res;
        
        
    }
    public int search(int[]a,int left,int right,int x)
    {
        //总是事先搜索正常排序的半边
        if(right<left) return -1;
        int mid = (left+right)/2;
        if(x==a[left])
            return left;
        if(x==a[right])
            return right;
        if(x==a[mid])
            return mid;
        if(a[left]<a[mid])
        //左半边为正常排序
        {
            if(x>a[left]&&x<a[mid])
                return search(a,left,mid-1,x);
            else
                return search(a,mid+1,right,x);
        }
        else if(a[mid]<a[right])
        //右半边是正常排序
        {
             if(x>a[mid]&&x<a[right])
                return search(a,mid+1,right,x);
            else
                return search(a,left,mid-1,x);
        }
        return -1;
    }
}


你可能感兴趣的:(java,程序员面试金典,排序与查找)