LeetCode刷题笔记(一)数组——二分查找法
提示:刷题顺序参考
前言
LeetCode刷题小白,本文主要记录数组之二分查找法的一点刷题笔记,如有错误,联系更正。
一、概述
- 算法要求:有序排列。
- 时间复杂度:最坏情况下为O(log n)。
二、代码模板(c++)
具体可参考题目:LeetCode 704.二分查找
1.版本一
**左闭右闭区间 **代码如下(示例):
class Solution {
public:
int search(vector<int>& nums, int target) {
int low = 0;
int high = nums.size() - 1; //右闭
while(low <= high) //注意这里是左小于等于右
{
int mid = low + (high - low)/ 2; //避免数值溢出,相当于(low + high)/ 2
if(nums[mid] < target)
low = mid + 1;
else if(nums[mid] > target)
high = mid - 1;
else
return mid;
}
return -1;
}
};
2.版本二
左闭右开区间代码如下(示例):
class Solution {
public:
int search(vector<int>& nums, int target) {
int low = 0;
int high = nums.size(); //右开
while(low < high) //注意这里是左小于右
{
int mid = low + (high - low)/ 2; //避免数值溢出,相当于(low + high)/ 2
if(nums[mid] < target)
low = mid + 1;
else if(nums[mid] > target)
high = mid; //右开区间,不会取到mid
else
return mid;
}
return -1;
}
};
该题目可作为学习二分查找算法的模板,二分查找的题目大多与此类似。
三、相关题目
35.搜索插入位置
34.在排序数组中查找元素的第一个和最后一个位置
69.x 的平方根
367.有效的完全平方数
- 对于35.搜索插入位置题,思路与模板基本一致,不同的地方在于返回值,返回值应是等于目标值的前一个位置或大于目标值的数中最小的数的前一个位置。
- 对于34.在排序数组中查找元素的第一个和最后一个位置题,只需在找到目标值后,分别向前和向后检索临界值。
- 对于69.x 的平方根以及367.有效的完全平方数,需要理解寻找平方根的过程。
四、相关知识
1.vector容器常用操作
- 定义
vector<int> res; //定义一个int型的容器
- 迭代器
res.begin() //指向容器的第一个元素,即res[0]
res.end() //指向容器末尾,即res.size()的位置
3.插入
res.push_back(8); //向容器末尾添加元素8
res.insert(const_iterator pos,6); //在迭代器pos位置添加元素6
res.insert(const_iterator pos,2,6); //在迭代器pos位置添加2个元素6
4.删除
res.pop_back(); //删除容器中最后一个元素
res.erase(const_iterator pos); //删除pos位置的元素
res.erase(const_iterator pos1,const_iterator pos2); 删除[pos1,pos2)区间的元素
5.容器中元素个数
res.size();
2.int型数值溢出处理
以上述题目为例,分析可能的情况:
- 加法溢出
mid = (low + high)/ 2; //可能产生溢出,可等价替换为
mid = low + (high - low)/ 2;
- 乘法溢出
if(mid * mid < target) //可能发生溢出,有两种替换方法
if(mid < target/ mid) //不精确,在题69中可行,但在题367中不适用
if((long)mid * (long)mid < target) //将int强制转换为long型,可解决溢出问题