描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]
分析
想无视时间要求,用O(n)的方式来做,非常简单
代码
vector<int> searchRange(vector<int>& nums, int target) {
int start=-1,end = -1;
for(int i = 0;i<nums.size();i++){
if (nums[i] == target)
{
if(start == -1)start = i;
end = i;
}
}
vector<int>ans;
ans.push_back(start);
ans.push_back(end);
return ans;
考虑时间要求,用二分的方法,毕竟二分的方法就建立在有序数组上
同样的思路用C++写了报
AddressSanitizer: heap-buffer-overflow
的错误,实在不解
最后用python写的
def searchRange(self, nums: List[int], target: int) -> List[int]:
llen = len(nums)
l = 0
r = llen-1
loc = -1
ans = []
while(l<=r):
mid = int((l+r)/2)
if nums[mid] == target:
loc = mid
break
elif nums[mid] < target:
l = mid + 1
else:
r = mid - 1
if loc == -1:
ans.append(-1)
ans.append(-1)
else:
l = loc
r = loc
while l>=0 and nums[l]==target:
l -= 1
while r<llen and nums[r]==target:
r += 1
ans.append(l+1)
ans.append(r-1)
return ans