(Weather::上海 ⛅多云,13~23℃ 良 清风徐徐🌘)
代码随想录 (programmercarl.com)
✏随笔
704.二分查找
代码
class Solution {
public:
int search(vector<int>& nums, int target) {
int j=size(nums)-1;
for(int i=0;i<=j;)
{
int mid=(i+j)/2;
if(target<nums[mid])
{
j = mid-1;
}
else if(target>nums[mid])
{
i = mid+1;
}
else return mid;
}
return -1;
}
};
时间复杂度:O(logn)
空间复杂度:O(1)
总结
二分法的难点在于区间的定义,一般有左闭右闭、左闭右开两种,个人喜欢前一种。
- 当左闭右闭时,left<=right有意义,且因为两端均包含,所以在更新mid时,right为mid-1,left为mid+1。注意,要想实现右闭,size(nums)要-1,因为数组是从0开始的。
- 左闭右开时,left=right时[left,right) 无意义,所以更新时也要保持左闭右开,left更新为mid+1,right更新为mid
35.搜索插入位置
代码
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int j=size(nums)-1;
for(int i=0;i<=j;)
{
int mid = (i+j)/2;
if(target<nums[mid])
{
j = mid-1;
}
else if(target>nums[mid])
{
i = mid+1;
}
else return mid;
}
return j+1;
}
};
总结
和上个差不多