解题思路:


    使用双向指针 left right 记录 左右范围

    如果left > right 查找结束

    设置 m = (left + right) >>> 1 ,m为中间索引  (可更改为 m = left + right / 2,   使用无符号右移 避免数据过大超出int范围)  

    判断target值与左右指针的关系 如果此时m位置  小于 target 缩小right 反之 增大left 并返回 判断条件

    直到left > right

注意事项:

    数组必须为有序递增

参考代码:

public static int[] binarySearch(int[] a, int target){
        //指针和初值
        int left = 1, right = a.length;
        while (1 < right - left){ //j - i范围内待查找的范围个数
            //在这里没有办法理解 >>>进位符的,可以使用:int middle = beginIndex + ((endIndex-beginIndex)/2);
            // >> 带符号右移
            int m = (left+right) >>> 1;
            //            int m = (i + j)/ 2;//获取中间索引
            if (target < a[m]){
                right = m;     //小于中间值
            } else {
                left = m;
            }
        }
        int tmp = a[0];
        for (int i = 0; i < left; i++) {
            a[i] = a[i+1];
        }
        a[left] = tmp;
        return a;
    }

QQ截图20231010222124.png


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论