二分查找

二分查找

在最简单的形式中,二分查找对具有指定左索引和右索引的连续序列进行操作。这就是所谓的查找空间。二分查找维护查找空间的左、右和中间指示符,并比较查找目标或将查找条件应用于集合的中间值;如果条件不满足或值不相等,则清除目标不可能存在的那一半,并在剩下的一半上继续查找,直到成功为止。如果查以空的一半结束,则无法满足条件,并且无法找到目标。

二分查找代码实现

模板一:

题目例题描述:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
完整的可运行的C++代码如下(递归版):

#include <iostream>
#include <vector>
using namespace std;

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int len=nums.size();
        if(len<1)
            return -1;
        return Binary_search(nums,0,len-1,target);
    }
    //核心代码
    int Binary_search(vector<int>& nums,int left,int right,int target){
        if(left>right)
            return -1;
        int mid=left+(right-left)/2;
        if(nums[mid]==target)
            return mid;
        else if(nums[mid]<target){
            return Binary_search(nums,mid+1,right,target);
        }else{
            return Binary_search(nums,left,mid-1,target);
        }
    }
};
int main(){
    vector<int> nums{-1,0,3,5,9,12};
    Solution s;
    cout<<s.search(nums,9)<<endl;
    return 0;
}

迭代版

int binarySearch(vector<int>& nums, int target){
  if(nums.size() == 0)
    return -1;

  int left = 0, right = nums.size() - 1;
  while(left <= right){
    // Prevent (left + right) overflow
    int mid = left + (right - left) / 2;
    if(nums[mid] == target){ return mid; }
    else if(nums[mid] < target) { left = mid + 1; }
    else { right = mid - 1; }
  }

  // End Condition: left > right
  return -1;
}

此模板 是二分查找的最基础和最基本的形式。这是一个标准的二分查找模板,用于查找可以通过访问数组中的单个索引来确定的元素或条件。
总结模板:
初始条件:left = 0, right = length-1
终止:left > right
向左查找:right = mid-1
向右查找:left = mid+1

模板二

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章