二分查找

二分查找

题目描述 请实现有重复数字的有序数组的二分查找。
输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。

因为用二分法查找数值的数组必须是在数组里面的数据排好序的前提下进行的,所以我们直接判断我们需要查询的值是不是比数组最后一个值a[n-1]大,如若是,直接返回数组长度加一

public class Solution {
    /**
     * 二分查找
     * @param n int整型 数组长度
     * @param v int整型 查找值
     * @param a int整型一维数组 有序数组
     * @return int整型
     */
    public int upper_bound_ (int n, int v, int[] a) {
        // write code here
        //先判断查询值与数组最后一位是否比他大,如果大,则直接返回n+1
        if(v > a[n-1]) {
            return n + 1;
        }
}

接下来我们直接做一个while循环判断,只要我们找到区间还在数组中,满足这个条件往下走,不满足跳出

while(end > start){
            int mid = start + (end - start)/2;
            if(a[mid] < v) {
                //如果查询值比mid的值大那就说明需要从数组后半段开始查找即end的值不变
                start = mid + 1;
            }else{//比mid小的话就直接在前半段查找,即start的值不变
                end = mid;
            }
        }

若是查询值比a[mid]的值要小,那么我们在数组的后半截开始继续查询,将mid的值赋值给start也就是我们用二分法查询的开头; 若是查询值比a[mid]的值要大,那么我们在数组的后半截开始继续查询,继续做循环判断查询将mid的值赋值给end也就是我们用二分法查询的结尾

最后我们在数组中找到了我们需要的值,例如5,4,[1,2,4,4,5]这个数组,第一次查找0+4/2 = 2,下标为二的数就是我们需要查的在数组中第一个大于等于查找值的位置,找到了我们继续往后半段查询,看看前面是否还有我们需要查询的值或是满足第一次大于查询值的条件的出现是在哪,这时候将mid 赋值给 start,end不变,也就是查询的是【2,4,5】这一数组,找到了我们直接返回位置,通过观察我们看到查询值是a【mid】,所以我们将mid + 1赋值给start这时赋的值就是start的下标,那么我们需要查找的是查询到的数据与原数据start加上1就能获取到这个元素的位置。

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页