二分法查找

二分法如果没有找到的话,最后的结果出来后肯定是low-high=1

准备工作

public class Direct{
    private int start;
    private int end;
    public Direct() {
        this.start = -1;
        this.end = -1;
    }
    public Direct(int start, int end) {
        this.start = start;
        this.end = end;
    }
    public int getStart() {
        return start;
    }
    public void setStart(int start) {
        this.start = start;
    }
    public int getEnd() {
        return end;
    }
    public void setEnd(int end) {
        this.end = end;
    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "{"start":""+this.start+"","end":""+this.end+""}";
    }
}

1、二分法查找(数组默认是有序的)

    public static boolean binarySearch(int[] arrays, int shu) {
        if(arrays==null||arrays.length==0) {
            return false;
        }
        int len = arrays.length;
        int start =0;
        int end = len - 1;
        int temp = 0;
        while(start<=end) {
            temp = (start+end)/2;
            if(arrays[temp]==shu) {
                return true;
            }else if(arrays[temp]<shu) {
                start = temp + 1;
            }else {
                end = temp - 1;
            }
        }
        return false;
    }

 2、查找大于等于给定数的数组的下标(数组默认从小到大排序的)

    public static Direct binarySearch(int[] arrays, int shu) {
        if(arrays==null||arrays.length==0) {
            System.out.println("不合法!");
            return new Direct(-1,-1);
        }
        int len = arrays.length;
        int start = 0;
        int end = len - 1;
        int temp = 0;
        while(start<=end) {
            temp = (start+end)/2;
            if(arrays[temp]<shu){
                start = temp + 1;
            }else {
                end = temp - 1;
            }
        }
        if(start==len) {
            System.out.println("数组中的数都小于指定的数!");
        }else if(end==-1){
            System.out.println("数组中的数都大于等于指定的数!");
        }else {
            System.out.println("成功找到!");
        }
        return new Direct(start, end);
        //这里的start就是大于等于指定数的数组的下标;end就是小于指定数的数组的下标
    }

3、查找大于指定数的数组的下标(数组默认从小到大排序的)

public static Direct binarySearch(int[] arrays, int shu) {
        if(arrays==null||arrays.length==0) {
            System.out.println("不合法!");
            return new Direct(-1,-1);
        }
        int len = arrays.length;
        int start = 0;
        int end = len - 1;
        int temp = 0;
        while(start<=end) {
            temp = (start+end)/2;
            if(arrays[temp]<=shu){
                start = temp + 1;
            }else {
                end = temp - 1;
            }
        }
        if(start==len) {
            System.out.println("数组中的数都小于等于指定的数!");
        }else if(end==-1){
            System.out.println("数组中的数都大于指定的数!");
        }else {
            System.out.println("成功找到!");
        }
        return new Direct(start, end);
        //这里的start就是大于指定数的数组的下标;end就是小于等于指定数的数组的下标
    }

4、寻找旋转数组中的最小值(无重复元素)

class Solution {
    public int findMin(int[] nums) {
        int l = 0;
        int h = nums.length - 1;
        while(l < h){
            int m = l + (h-l)/2;
            if(nums[m] > nums[h]){
                l = m + 1;
            }else if(nums[m]<nums[h]){
                h = m;
            }else{
                //这种情况不存在
            }
        }
        return nums[h];
    }
}

4、寻找旋转数组中的最小值(有重复元素)

class Solution {
    public int findMin(int[] nums) {
        int l = 0;
        int h = nums.length - 1;
        while(l < h){
            int m = l + (h-l)/2;
            if(nums[m] > nums[h]){
                l = m + 1;
            }else if(nums[m]<nums[h]){
                h = m;
            }else{
                h = h - 1;
            }
        }
        return nums[h];
    }
}

5、寻找峰值 

class Solution {
    public int findPeakElement(int[] nums) {
        int len = nums.length;
        int start = 0;
        int end = len - 1;
        int middle = 0;
        while(start<end){
            middle = (end+start)/2;
            if(nums[middle]<nums[middle+1]){
                start = middle + 1;
            }else if(nums[middle]>nums[middle+1]){
                end = middle;
            }else{
                //此情况不存在
            }
        }
        return start;
    }
}
原文地址:https://www.cnblogs.com/erdanyang/p/10972181.html