二分查找法

二分查找法,第1张

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

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

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

二分查找的做法:

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

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

注意:二分查找的条件是范围不为空,即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(numtarget时,说明要找的target的下标在num的左侧,故而将最高点设为原来的high-1
          }
        }
        return -1;//找不到目标值时,返回-1;
    }    
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/717616.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存