二分法—C语言
定义:
二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法。
二分法查找的思路如下:
- 首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。
- 如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作。
- 如果某一步数组为空,则表示找不到目标元素。
二分法查找的时间复杂度O(logn)。
实例:
在排序数组中查找元=元素的第一个和最后一个位置,给定一个按照升序排列的整数数组nums,和一个目标值target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值target,返回 [-1,-1]。
进阶:
你可以设计并实现时间复杂度为O(log n)的算法解决此问题吗?
示例1:
输入:nums = [5,7,7,8,8,10],target =8
输出:[3,4]
示例2:
输入:nums = [5,7,7,8,8,10].target = 6
输出:[-1,-1]
示例3:
输入:nums = [],target = 0
输出:[-1,-1]
提示:
- 0 <= nums.length <= 10^5
- -10^9 <= nums[i] <= 10^9
- nums是一个非递减数组
- -10^9 <= target <= 10^9
程序:
#include<bits/stdc++.h>
using namespace std;
class Solution{
public:
vector<int> searchRange(vector<int> &nums,int target){
vector<int> res;
res.push_back(binary_search_begin(nums,target));
res.push_back(binary_search_end(nums,target));
return res;
}
private:
int binary_search_begin(vector<int> &nums,int target){
int lo = -1;
int hi = nums.size();
while(lo+1<hi) //数组不为空
{
int mid =lo + (hi-lo)/2;
if(target>nums[mid])
{
lo = mid;
}
else
{
hi =mid;
}
}
if(hi==nums.size()||nums[hi]!=target)
{
return -1;
}
else
{
return hi;
}
}
int binary_search_end(vector<int> nums,int target){
int lo = -1;
int hi = nums.size();
while (lo +1 < hi)
{
int mid = lo +( hi -lo )/2;
if(target<nums[mid])
{
hi =mid;
}
else
{
lo = mid;
}
}
if( lo == -1||nums[lo] !=target)
{
return -1;
}
else
{
return lo;
}
}
};
有些明白了,当时这个C++结构我理不明白,不需要main()吗?
这是一道CSDN关于二分法的原题。在此做一下记录。