来自LeetCode每日一题,最近恰好在复习数据结构,所以整理一下二分查找
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int length = nums.size();
int low = 0, high = length-1, mid;
while(low <= high) // 若row>high时,还未找到,说明不存在
{
mid = (low+high)/2 ; // 取中点位置进行判断
if(nums[mid] == target) // 根据与中点位置判断大小决定上下界变化
return mid;
if(nums[mid] < target) // 取上一半或者下一半
low = mid+1;
else
high = mid-1;
}
if(low > high) // 找不到,返回其大一个的位置
return low;
return 0;
}
};
int main()
{
std::vector<int> v = {1, 3, 5, 6};
Solution so;
cout << so.searchInsert(v, 0);
}
题目中要求找到target的位置,返回其索引,若找不到,则返回其插入位置
看到顺序排列,自然想到二分查找来降低时间复杂度
我们设置了low high来标注下界与上届
关于最后返回点位置
最后若没找到,该返回low还是high呢?
不妨分析一下,假设low在7位,high在8位,target=7.5,进入循环,mid = 15/2 = 7位,此时target > mid,所以low = 8。
再次进入循环,mid=8大于targe,high--为7,达到结束条件。这时high < target < low,所以我们应该返回low