34. 在排序数组中查找元素的第一个和最后一个位置
两个二分查找分别寻找
class Solution {
public int[] searchRange(int[] nums, int target) {
/**
* 分别寻找第一个和最后一个target
*/
int left = 0;
int right = nums.length - 1;
int start = -1;
while (left <= right){
int mid = left + (right - left) / 2;
if (nums[mid] < target){
left = mid + 1;
}
else if (nums[mid] > target){
right = mid - 1;
}
else {
/**
* 如果找到了一个target,先保存位置,然后继续向左寻找
*/
start = mid;
right = mid - 1;
}
}
left = 0;
right = nums.length - 1;
int end = -1;
while (left <= right){
int mid = left + (right - left) / 2;
if (nums[mid] < target){
left = mid + 1;
}
else if (nums[mid] > target){
right = mid - 1;
}
else {
/**
* 如果找到了一个target,先保存位置,然后继续向右寻找
*/
end = mid;
left = mid + 1;
}
}
return new int[]{start, end};
}
}
/**
* 时间复杂度 O(logn)
* 空间复杂度 O(1)
*/
一个二分查找
class Solution {
public int[] searchRange(int[] nums, int target) {
/**
* 先找到任意一个target,记录位置
*/
int left = 0;
int right = nums.length - 1;
int start = -1;
int end = -1;
while (left <= right){
int mid = left + (right - left) / 2;
if (nums[mid] < target){
left = mid + 1;
}
else if (nums[mid] > target){
right = mid - 1;
}
else {
start = mid;
end = mid;
break;
}
}
/**
* 然后双指针向左向右遍历,找到第一个和最后一个位置
*/
while (start - 1 >= 0 && nums[start - 1] == target){
start--;
}
while (end >= 0 && end + 1 < nums.length && nums[end + 1] == target){
end++;
}
return new int[]{start, end};
}
}
/**
* 时间复杂度 O(logn)
* 空间复杂度 O(1)
*/
https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/