1.数组一次旋转的问题

题目描述:

1.1 题目分析

  1. 处于递增:low上移

  2. 处于递减:high下移(如果是high-1,则可能会错过最小值,因为找的就是最小值)

  3. 其余情况:low++缩小范围

1.2 根据算法分析,编写程序实现如下

   public int minNumberInRotateArray(int [] array) {
        int left = 0,right = array.length-1,mid;
        while(left<right){
            mid = left + ((right-left)>>1);
            if(array[mid]>array[right]){
                left = mid+1;
            }else{
                right = mid;
            }
        }
        return array[right];
    }  

2. 数组变换找目标值的问题

题目描述:给出一个转动过的有序数组,你事先不知道该数组转动了多少 (例如,0 1 2 4 5 6 7可能变为4 5 6 7 0 1 2). 在数组中搜索给出的目标值,如果能在数组中找到,返回它的索引,否则返回-1。 假设数组中不存在重复项。

输入:[1],0
输出:-1

输入:[3,2,1],1
输出:2

   /**
     * 
     * @param A int整型一维数组 
     * @param target int整型 
     * @return int整型
     */
    public int search (int[] A, int target) {
        // write code here
        if(A==null)return -1;
        int left = 0,right = A.length-1,mid;
        while(left<=right){
            mid = left + ((right-left)>>1);
            if(A[mid]==target)return mid;
            if(A[left]==target)return left;
            if(A[right]==target)return right;
            if(A[mid]>A[right]){
                if(target>A[mid] && target<A[right])
                    left = mid+1;
                else
                    right = mid-1;
            }else{
                if(target>A[left] && A[mid]>target){
                    right = mid-1;
                }else if (target>A[right] || target<A[mid])
                    right = mid-1;
                else 
                    left = mid+1;
            }
        }
        return -1;
    }