LeetCode——34 搜索范围:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级

xiaoxiao2021-03-01  38

拿到题目,看到时间要求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,其中的思想和我是一样的,但是代码运行显示超时,这我也就不明白了,希望我的代码对大家有用吧!

原创哦!

转载请注明原文地址: https://www.6miu.com/read-3349983.html

最新回复(0)