算法总结之 在数组中找到一个局部最小的位置

给定无序数组arr, 已知arr中任意连个相邻的数都不相等。  写一个函数,只需返回arr中任意一个局部最小出现的位置

本题利用二分查找

   1 如果arr为空后者长度为0,返回-1

   2 如果arr长度为1或者arr[0]<arr[1]  返回0

  3 如果arr[N-1] < arr[N-2] 返回N-1

 4 如果长度大于2 且 arr的左右两头都不是局部最小,则令 left=1, right =N-2, 然后进行二分查找

   给定思路   mid=(left+right)/2 

    如果 arr[mid] > arr[mid-1]  那么在 left......mid-1上肯定存在局部最小  所以令 right=mid-1

    如果 arr[mid] < arr[mid+1]  那么在 mid+1......right上肯定存在局部最小  所以令 left=mid+1

   上面两个都不满足,arr[mid] 就是局部最小  返回mid

    一直查找 知道left == right时停止  返回left就ok

由此可见!!!!!! 二分查找并不是数组有序才能使用!!!!

  

      

package TT;

public class Test78 {

    public static int getLessIndex(int[] arr){
        if(arr==null || arr.length==0){
            return -1;
        }
        
        if(arr.length==1 || arr[0] <arr[1]){
            return 0;
        }
        if(arr[arr.length-1] < arr[arr.length-2]){
            return arr.length-1;
        }
        
        int left = 1;
        int right = arr.length-2;
        int mid = 0;
        
        while(left <right){
            
            mid = (left+right)/2;
            if(arr[mid]>arr[mid-1]){
                right = mid-1;
            }else if(arr[mid]>arr[mid+1]){
                left = mid+1;
            }else {
                return mid;
            }            
            
        }
        
           return left;
        
    }
    
    public static void main(String[] args){
        
        int[] arr = new int[6];
        arr[0]=6;
        arr[1]=4;
        arr[2]=2;
        arr[3]=3;
        arr[4]=5;
        arr[5]=4;
        
        int x = getLessIndex(arr);
        System.out.println(x);
        
    }
    
}

 

posted @ 2017-09-08 14:05  toov5  阅读(1384)  评论(0编辑  收藏  举报