二分查找法

***问题背景:在有序数组nums中寻找目标值target,对于特定的下标i,比较nums[i]和target的大小。

  1. 如果nums[i]=target,则下标i为所需要查找的下标。
  2. 如何nums[i]>target,则target只可能在下标i的左侧。
  3. 如果nums[i]<target,则target只可能在下标i的右侧。

***基于上述可以使用二分法寻找目标值。其中二分法的时间复杂度为O(log n),空间复杂度为O(1)。

二分查找的做法:

定义查找范围 [left,right],初始查找范围是整个数组,每次取查找范围的中点mid,比较nums[mid]和target值得大小。

  • 如果相等,则mid即为所寻求得下标;
  • 如果nums[mid]>target,则所查找得上限变为right = mid-1,继续查找;
  • 如果nums[mid]<target,则所查找的下限变为left = mid+1,继续查找。

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

***示例题目:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-search

示例代码:

class Solution {
    public int search(int[] nums, int target) {
        int low = 0, high = nums.length - 1;
        while(low <= high){
          int mid = (high-low)/2 + low;//二分,划为两个区域
          int num = nums[mid];
          // num = target时,要找的下标即为mid;
          if(num == target){ 
              return mid;
          }else if(num<target) { // num<target时,说明要找的target的下标在num的右侧,故而将最低点设为原来的mid+1
              low = mid+1;
          }else{
              high = mid-1; //num>target时,说明要找的target的下标在num的左侧,故而将最高点设为原来的high-1
          }
        }
        return -1;//找不到目标值时,返回-1;
    }    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值