34. 在排序数组中查找元素的第一个和最后一个位置
Difficulty: 中等
给定一个按照升序排列的整数数组 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 <= 10<sup>5</sup>-10<sup>9</sup> <= nums[i] <= 10<sup>9</sup>nums是一个非递减数组-10<sup>9</sup> <= target <= 10<sup>9</sup>
Solution
Language: java
class Solution {
public int[] searchRange(int[] nums, int target) {
if(nums == null || nums.length == 0) return new int[]{-1 , -1};
int findFirstPosition = findFirstPosition(nums, target);
int findLastPosition = findLastPosition(nums, target);
return new int[]{findFirstPosition , findLastPosition};
}
/***
* 找出target最后一个出现的位置
* @param nums
* @param target
* @return
*/
private int findLastPosition(int[] nums , int target)
{
int start = 0;
int end = nums.length - 1;
while(start <= end)
{
int mid = start + (end - start) / 2;
if(nums[mid] == target)
{
if(mid == nums.length - 1 || nums[mid + 1] != target)
{
return mid;
}
else
{
start = mid + 1;
}
}
else if(nums[mid] > target)
{
end = mid - 1;
}
else{
start = mid + 1;
}
}
return -1;
}
/***
* 找出target第一个出现的位置
* @param nums
* @param target
* @return
*/
private int findFirstPosition(int[] nums , int target)
{
int start = 0;
int end = nums.length - 1;
while(start <= end)
{
int mid = start + (end - start) / 2;
if(nums[mid] == target)
{
if(mid == 0 || nums[mid - 1] != target)
{
return mid;
}
else
{
end = mid - 1;
}
}
else if(nums[mid] > target)
{
end = mid - 1;
}
else{
start = mid + 1;
}
}
return -1;
}
}