二分查找和双指针

一、二分查找

例:在一个升序的数组中,查找target。

①确定查找范围,设置i = 0;j = n - 1;

②然后折半,(i + j)/2,判断该索引位置的值与目标值大小

③若是相等则就找到了,大的话目标值就在左半段,小的则在有半段。

④直至( j < i )还没找到target,则没有。

例:假如,该数组有多个target,我想要位置最左边的那个。

public static int binarySearch(int[] a,int target){
    int i = 0,j = a.length - 1;
    int candidate = -1;
    while(i <= j){
        int m = (i + j) >>> 1;
        if(terget < a[m]){
            j = m - 1;
        }else if(a[m] < target){
            i = m + 1;
        }else {
            candidate = m;
            j = m - 1;
        }
    }
    return candidate;
}

二分查找最左边的那个值。

如果只要普通二分查找将candidate变量删去,target == a[m] 时,直接返回索引。

当然,知道了二分查找找最左边那个值,要是我想找左右边的那个值呢,将第二个else语句的j = m - 1,换成j = m + 1即可。

题:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

  public int searchInsert(int[] nums, int target) {
        int i = 0,j = nums.length - 1;
        while(i <= j){
            int m = (i + j) >>> 1;
            if(target < nums[m]){
                j = m - 1;
            }else if(nums[m] < target){
                i = m + 1;
            }else {
                return m;
            }
        }
        return i;
    }

 二、双指针

你可能感兴趣的:(备战蓝桥杯,算法,数据结构,java)