哈喽🥳🥳🥳,新的一年的第一篇blog❤️
前面一连出了几篇知识点整理的blog,今天这篇主要是对题的讲解,分享一道最近在leetcode上刷到的题🍉
废话不多说,现在进入正题👇
题目:给你一个按照非递减顺序(其实就是递增数列🫣)排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1,-1]。必须设计并实现时间复杂都为O(log n)的算法解决此问题。
刷题传送门🚪:在排序数组中查找元素的第一个和最后一个位置
可以先自己试着写一写,再来看接下来的题目讲解🍉🥥🥝🍈🍌
从题干中递增数列和O(log n)的算法,我们能够大概猜测🧐到要使用二分查找(如果有不清楚二分查找的小可爱们🫠,可以去看我之前的blog,有详细讲解二分查找)
☃️那要怎么用二分查找呢
在回到题干,我们要找到第一个位置和最后一个位置,这说明我们很可能要用两次二分查找(好吧,其实就是要用两次),一次找到第一个位置,一次找到最后一个位置。
现在我们可以尝试开始敲代码了🏋️♀️🏋️♀️🏋️♀️
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int BinarySearch(int* nums,int numsSize,int target,bool low)
{
int left=0;
int right=numsSize-1;
int ans=numsSize;
while(left<=right)
{
int mid=(left+right)/2;
if((low&&nums[mid]>=target)||nums[mid]>target)
{
right=mid-1;
ans=mid;
}
else
{
left=mid+1;
}
}
return ans;
}
int* searchRange(int* nums, int numsSize, int target, int* returnSize)
{
int leftnums=BinarySearch(nums,numsSize,target,true);
int rightnums=BinarySearch(nums,numsSize,target,false)-1;
int* ret=(int*)malloc(sizeof(int)*2);
if(leftnums<=rightnums&&nums[leftnums]==target&&nums[rightnums]==target&&rightnums<numsSize)
{
ret[0]=leftnums;
ret[1]=rightnums;
*returnSize=2;
return ret;
}
else
{
ret[0]=-1;
ret[1]=-1;
*returnSize=2;
return ret;
}
}
我们要使用两次二分查找,所以就可以将二分查找的代码分装到一个函数中,这样能够让代码简洁明了
这篇blog到这里就结束了🎆🎇🎆,创作不易,还望各位多多支持🥰😘
如有错的地方还望各位大佬多多指正🤗🫶🫶🫰❤️
最后,祝大家在新的一年开开心心,顺顺利利,学有所成❤️❤️❤️❄️☃️⛄