问题描述:
给定一个按照升序排列的整数数组 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]
解题思路:
由于数组是排好序的,所以常用的方法是二分法;需要注意的是我们要查找两个位置,所以可能需要多次调用二分法。
还有一种方法是从头开始遍历,但是由于数组排好序,即目标值都是连续在一起的。所以并不一定需要遍历整个数组。在效率上并不比二分法差多少。
代码实现:
public int[] searchRange(int[] nums, int target) {
int[] res = new int[2];
res[0] = -1;
res[1] = -1;
for(int i=0; i<nums.length; i++){
if(nums[i]==target){
res[0] = i;
int j = i;
while(j<nums.length && nums[j]==target) j++;
res[1] = j-1;
break;
}
}
return res;
}
提交结果: