社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
拿到题目,看到时间要求O(logn),立刻想到了折半查找
已通过的代码如下:
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
//折半查找思路
int low,high,mid,len;
len=nums.size();
low=0;
high=len-1;
vector<int> result(2,-1); //初始化返回两个-1
if(len == 0)
return result; //容易忽略输入为空的情况
while(low <= high)
{
mid = ( low + high )/2;
if(target == nums[mid]) //等于有些麻烦,需要从左右两侧查找,确定范围
{
int i = mid;
int j = mid;
while ((i>=0) && (nums[i] == target)) i--;
if(i<0)
result[0]=0;
else
result[0]=i+1; //用自增或自减,先增还是先操作顺序位置容易出错,所以直接加1或-1
while ((j<len) && (nums[j] == target)) j++;
if(j>len)
result[1]=len-1;
else
result[1]=j-1;
return result;
}
else if(target < nums[mid]) //小于
high = mid-1;
else if(target > nums[mid]) //大于
low = mid+1;
}
return result;
}
};
整体是按照折半的思路走的,就是做等于情况的时候,有些绕弯,但是还是通过了测试。不过我自己没有分析出来时间性能到底是多少。Leetcode给的结果还是让我很吃惊的,超过了98.26%,嗯,还不错
通过他的时间性能测试还是经过了多次修改的,也参考了一些代码https://blog.csdn.net/i_am_bird/article/details/78748163,其中的思想和我是一样的,但是代码运行显示超时,这我也就不明白了,希望我的代码对大家有用吧!
原创哦!
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!