leetcode 二分题 C++实现 (未完
有两种区间的分法:
把数组分成三个区间,[left,mid-1] mid [mid+1,right],使用这种写法通常的情况是要找的元素的性质比较简单,直接。
把数组分成两个区间[left,mid] [mid+1,right]或[left,mid-1] [mid,right],把区间分成“一定不存在目标元素的区间”和“可能存在目标元素的区间”,适合于元素的性质比较复杂的题目。
简单题:
704. 二分查找
时间复杂度o(logn),空间复杂度o(1)
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0,right=nums.size()-1;
while(left<=right)
{
int mid=(left+right)/2;
if(target>nums[mid])
{
left=mid+1;
}
else if(target<nums[mid])
{
right=mid-1;
}
else
{
return mid;
}
}
return -1;
}
};
35. 搜索插入位置
时间复杂度o(logn),空间复杂度o(1)
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
if(target > nums[nums.size() - 1])
{
return nums.size();
}
int left = 0, right = nums.size() - 1;
while(left < right)
{
int mid = left + (right - left) / 2;
if(nums[mid] < target)
{
left = mid + 1;
}
else
{
right = mid;
}
}
return left;
}
};
69. x 的平方根
时间复杂度o(logn),空间复杂度o(1)
class Solution {
public:
int mySqrt(int x) {
int left = 0, right = x;
int res;
while(left <= right)
{
int mid = (left + right) / 2;
if((long long)mid * mid <= x)
{
res = mid;
left = mid + 1;
}
else
{
right = mid - 1;
}
}
return res;
}
};
两区间法要注意,这里的mid要向上取整,否则会陷入死循环。
时间复杂度o(logn),空间复杂度o(1)
class Solution {
public:
int mySqrt(int x) {
if(x == 0 || x == 1)
return x;
long long left = 1, right = x / 2;
while(left < right)
{
int mid = left + (right - left + 1) / 2;
if(mid > (x / mid))
{
right = mid - 1;
}
else
{
left = mid;
}
}
return left;
}
};
中等题
633. 平方数之和
时间复杂度o(sqrt(c)),空间复杂度o(1)
class Solution {
public:
bool judgeSquareSum(int c) {
long long left = 0, right = sqrt(c);
while(left <= right)
{
if((left * left + right * right) == c)
{
return true;
}
else if((left * left + right * right) < c)
{
left++;
}
else
{
right--;
}
}
return false;
}
};
参考资料:
写对二分查找不能靠模板,需要理解加练习 (附练习题,持续更新)

浙公网安备 33010602011771号