目录
题目
思路
代码
C语言
Python
题目
给你一个按照非递减顺序排列的整数数组 nums
,和一个目标值 target
。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target
,返回 [-1, -1]
。
你必须设计并实现时间复杂度为 O(log n)
的算法解决此问题。
示例 1:
输入:nums = [5,7,7,8,8,10]
, target = 8
输出:[3,4]
示例 2:
输入:nums = [5,7,7,8,8,10]
, target = 6
输出:[-1,-1]
示例 3:
输入:nums = [], target = 0 输出:[-1,-1]
提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
nums
是一个非递减数组-109 <= target <= 109
思路
时间要求是时间复杂度为 O(log n)
,这时候考虑二分法。
先利用二分法找到一个目标值,然后在目标值前后遍历,直到超出数组范围或者遍历到不同的数字。因为与target相同的数可能有多个。
代码
C语言
#include <stdio.h>
#include <stdlib.h>
int *searchRange(int *nums, int numsSize, int target, int *returnSize);
int main()
{
int nums[6] = {5, 7, 7, 8, 8, 10};
int t[1];
int *res = searchRange(nums, 6, 8, t);
for (int i = 0; i < t[0]; i++)
{
printf("%d ", res[i]);
}
}
int *searchRange(int *nums, int numsSize, int target, int *returnSize)
{
int *res = (int *)malloc(sizeof(int) * 2);
int low = 0, high = numsSize - 1;
*returnSize = 0;
int mid;
while (low <= high)
{
mid = (low + high) / 2;
if (nums[mid] > target)
{
high = mid - 1;
}
else if (nums[mid] < target)
{
low = mid + 1;
}
else
{
break;
}
}
if (low > high)
{
res[0] = -1;
res[1] = -1;
}
else
{
int left, right;
for (left = mid - 1;left >= 0 && nums[left] == nums[mid]; left--)
;
for (right = mid + 1; right < numsSize && nums[right] == nums[mid]; right++)
;
res[0] = left + 1;
res[1] = right - 1;
}
*returnSize = 2;
return res;
}
Python
class Solution(object):
def searchRange(self, nums, target):
lis=[]
try:
lis.append(nums.index(target))
except:lis.append(-1)
i=len(nums)-1
for i in range(len(nums)-1,-1,-1):
if nums[i]==target:
lis.append(i)
break
if i==-1 or nums[i]!=target:
lis.append(-1)
return lis