博客
关于我
二分查找(递归)
阅读量:355 次
发布时间:2019-03-04

本文共 1077 字,大约阅读时间需要 3 分钟。

为了解决这个问题,我们需要找到一个排好序的整型数组中比给定数字稍微大一点的那个位置。如果没有找到这样的位置,则返回-1。我们将使用二分查找来高效地解决这个问题。

方法思路

  • 问题分析:由于数组是排好序的,二分查找是一个高效的选择。我们需要找到第一个大于给定数字的位置。
  • 递归设计:递归方法需要传入数组、起始位置、结束位置和目标数字。中间位置的计算是关键,根据目标数字的大小决定搜索方向。
  • 终止条件:当起始位置和结束位置相邻时,比较目标数字和当前位置的值,决定返回起始位置还是结束位置。
  • 解决代码

    public class Main {    public static void main(String[] args) {        int arr[] = {1, 5, 11, 24, 25, 32, 32, 32, 33};        System.out.println(solve(arr, 32));    }    public static int solve(int arr[], int x) {        if (x >= arr[arr.length - 1])            return -1;        return solve(arr, 0, arr.length - 1, x);    }    private static int solve(int[] arr, int begin, int end, int x) {        if (end - begin == 1) {            if (arr[begin] > x)                return begin;            return end;        }        int k = (begin + end) / 2;        if (x >= arr[k])            return solve(arr, k, end, x);        return solve(arr, begin, k, x);    }}

    代码解释

  • 主函数:调用solve方法,传入数组和目标数字。
  • 初始检查:如果目标数字大于或等于数组的最大值,直接返回-1。
  • 递归方法:计算中间位置,根据目标数字的大小决定搜索方向。终止条件是起始位置和结束位置相邻,比较目标数字和当前位置的值,返回合适的位置。
  • 这个方法利用了二分查找的高效性,确保在O(log n)时间复杂度内找到目标位置。

    转载地址:http://glwg.baihongyu.com/

    你可能感兴趣的文章
    VTK:相互作用之MouseEventsObserver
    查看>>
    VTK:相互作用之PickableOff
    查看>>
    VTK:相互作用之Picking
    查看>>
    VTK:灯光之SpotLights
    查看>>
    VTK:Medical之MedicalDemo2
    查看>>
    libfacedetection库的配置及基本使用——内涵(cmake编译libfacedetection库)
    查看>>
    VS配置属性表,保存Opencv配置信息
    查看>>
    c语言(基本数据类型)实参与形参传值 用汇编理解
    查看>>
    输入端噪声容限
    查看>>
    vue——this.$route 与 this.$router
    查看>>
    基于单片机可控音乐流水灯控制设计-全套资料
    查看>>
    基于单片机简易信号误差分析设计-全套资料
    查看>>
    基于单片机简易洗衣机系统仿真设计-全套资料
    查看>>
    基于单片机简易脉搏测量仪系统设计-毕设课设资料
    查看>>
    基于单片机八层电梯系统控制设计-毕设课设资料
    查看>>
    并发框架下的“基础类型”——浅析基本类型、ThreadLocal、原子类的线程安全机制
    查看>>
    c++ 如何给 “运行中“ 的线程传递数据;
    查看>>
    Android Studio同步Gradle失败的解决办法
    查看>>
    VHDL代码风格
    查看>>
    Sepic电路的参数计算及仿真
    查看>>