契子
本科对C++的了解其实比较多,但是一直疏于使用C++的STL,最近在LeetCode刷题,发现大多数算法的C++都是使用STL,故打算花几天熟悉一下,重新捡起来,在实践中运用;也便于之后工作的面试。
LeetCode704. 二分查找算法(C++)
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
用到的容器–vector
本质:一个可变长的数组(与array区分,array是固定长度)
- v.size(),求v的长度
- 访问元素,可以直接v[i];或者使用迭代器遍历
代码实现
class Solution {
public:
int search(vector<int>& nums, int target) {
int mid, left = 0, right = nums.size()-1;
while(left <= right){
mid = (right + left) / 2;
if(nums[mid] == target)
return mid;
else if(nums[mid] > target)
right = mid - 1;
else
left = mid + 1;
}
return -1;
}
};
LeetCode35. 搜索插入位置(二分查找算法的变型)
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
算法思想
重点在于查找不成功后的插入位置的判断
查找不成功的判别条件是left>right
因为每一次判断只会有left或者right移动,且最终都会二分为只有一个元素的子序列,所以在判定失败的上一步一定是left=right,从而mid=left=right,接下来有两种查找失败的情况:
- target 更大,即插入在mid后面。此时操作是left=mid+1,插入位置在left
- target更小,即插在mid前面。此时操作是right=mid-1,因为是插入在right后面,所以应该再加1
代码实现
int searchInsert(vector<int>& nums, int target) {
int mid, left=0, right=nums.size()-1;
while(left <= right){
mid = (left + right) / 2;
if(nums[mid] == target)
return mid;
else if(nums[mid] > target)
right = mid - 1;
else
left = mid + 1;
}
return mid<left ?left : right+1;
}