LeetCode704.二分查找&35.搜索插入位置(C++)
前言
今天都是「二分」LeetCode704.二分查找&LeetCode35.搜索插入位置
LeetCode704.二分查找
点击链接开始刷题φ(゜▽゜*)♪:LeetCode704.二分查找
解题思路
- 设置 left、right 左右两个指针和中间指针 mid
- 因为数组是升序的,如果 target 存在于数组中
- 计算 mid
- nums[mid]<target,说明 target 在 (mid,right] 这个区间,则更新 left 为 mid+1;
- nums[mid]>target,说明 target 在 [left,mid) 这个区间,则更新 right 为 mid-1;
- nums[mid]==target,直接返回 target 的下标 mid,
- 当不满足循环条件 left<=right 的时候还没找到 target,说明 target 不在 nums 数组中,返回 -1。
代码
class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.size()==0)
return -1;
int mid;
int left=0;
int right=nums.size()-1;
while(left<=right){
mid = left + right >> 1;
if(nums[mid]<target)
left = mid + 1;
else if(nums[mid]>target)
right = mid - 1;
else
return mid;
}
return -1;
}
};
- 时间复杂度:O(log n)
- 空间复杂度:O(1)
LeetCode35.搜索插入位置
点击链接开始刷题φ(゜▽゜*)♪:LeetCode35.搜索插入位置
解题思路
这道题比上一道多了一步,若没找到需要返回target应该插入的位置,做个简单的判断就OK了。
- 当不满足循环条件 left<=right 的时候还没找到 target,说明 target 不在 nums 数组中;
- 若 nums[mid]<target 则 target 的插入位置在 nums[mid] 的后一个,返回 mid+1;
- 否则 target 应该插入的位置为 mid。
代码
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
if(nums.size()==0)
return 0;
int mid;
int left = 0;
int right = nums.size()-1;
while(left<=right){
mid = (left + right) >> 1;
if(nums[mid]<target)
left = mid + 1;
else if(nums[mid]>target)
right = mid-1;
else
return mid;
}
if(nums[mid]<target)
return mid+1;
return mid;
}
};
- 时间复杂度:O(log n)
- 空间复杂度:O(1)