• 【算法】二分查找


    二分法查找适用于数据量较大时,但是数据需要先排好顺序。主要思想是:(设查找的数组区间为array[low, high])
    (1)确定该区间的中间位置K(2)将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。区域确定如下:a.array[k]>T 由数组的有序性可知array[k,k+1,……,high]>T;故新的区间为array[low,……,K-1]b.array[k]

    时间复杂度

    • 最坏情况查找最后一个元素(或者第一个元素)Master定理T(n)=T(n/2)+O(1)所以T(n)=O(log2n)
    • 最好情况查找中间元素O(1)查找的元素即为中间元素(奇数长度数列的正中间,偶数长度数列的中间靠左的元素)

    空间复杂度

    S(n)=logn

    题目

    给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

    示例 1

    输入: nums = [-1,0,3,5,9,12], target = 9
    输出: 4
    解释: 9 出现在 nums 中并且下标为 4

    示例2

    输入: nums = [-1,0,3,5,9,12], target = 2
    输出: -1
    解释: 2 不存在 nums 中因此返回 -1

    提示

    • 你可以假设 nums 中的所有元素是不重复的。
    • n 将在 [1, 10000]之间。
    • nums 的每个元素都将在 [-9999, 9999]之间。

    二分查找

    在升序数组nums 中寻找目标值target,对于特定下标 i,比较nums[i] 和target 的大小:

    • 如果nums[i]=target,则下标 ii 即为要寻找的下标;
    • 如果nums[i]>target,则arget 只可能在下标 ii 的左侧;
    • 如果nums[i]

    基于上述事实,可以在有序数组中使用二分查找寻找目标值。

    二分查找的做法是,定义查找的范围[left,right],初始查找范围是整个数组。每次取查找范围的中点 mid,比较nums[mid] 和 target 的大小,如果相等则mid 即为要寻找的下标,如果不相等则根据 nums[mid] 和 target 的大小关系将查找范围缩小一半。

    由于每次查找都会将查找范围缩小一半,因此二分查找的时间复杂度是O(log n),其中 n 是数组的长度。

    二分查找的条件是查找范围不为空,即left≤right。如果target 在数组中,二分查找可以保证找到 target,返回target 在数组中的下标。如果target 不在数组中,则当left>right 时结束查找,返回−1。

    public class Solution {
        public int Search(int[] nums, int target) {
            int left = 0, right = nums.Length - 1;
            while (left <= right) {
                int mid = (right - left) / 2 + left;
                int num = nums[mid];
                if (num == target) {
                    return mid;
                } else if (num > target) {
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }
            }
            return -1;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    来源

    二分法查找
    力扣-704. 二分查找

  • 相关阅读:
    [资源推荐] 复旦大学张奇老师科研分享
    路由算法简介
    M系列 Mac安装配置Homebrew
    kubernetes中的静态POD
    Rockchip RK3399 - USB触摸屏接口驱动
    k8s手撕架构图+详解
    关于Windows 7操作系统进行磁盘碎片整理时提示“已使用其他程序计划了磁盘碎片整理程序”的解决办法
    VictoriaMetrics之vmagent
    Spring @Transactional 原理解析
    java计算机毕业设计期刊在线投稿系统源码+系统+数据库+lw文档+mybatis+运行部署
  • 原文地址:https://blog.csdn.net/weixin_44231544/article/details/126134808