二分查找

二分查找

在最簡單的形式中,二分查找對具有指定左索引和右索引的連續序列進行操作。這就是所謂的查找空間。二分查找維護查找空間的左、右和中間指示符,並比較查找目標或將查找條件應用於集合的中間值;如果條件不滿足或值不相等,則清除目標不可能存在的那一半,並在剩下的一半上繼續查找,直到成功爲止。如果查以空的一半結束,則無法滿足條件,並且無法找到目標。

二分查找代碼實現

模板一:

題目例題描述:
給定一個 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

模板二

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