Python
时间复杂度:O(logn),其中 n 为 nums 的长度。
空间复杂度:O(1),仅用到若干额外变量。
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
start = self.find(nums, target)
end = self.find(nums, target + 1) - 1
return [start, end] if start <= end else [-1, -1]
def find(self, nums, target):
l, r = 0, len(nums)-1
while l <= r: # 要考虑mid=l(r)的情况,所以必须保留等号
mid = (l + r) // 2
if nums[mid] < target:
l = mid + 1 # 肯定满足 nums[l] >= target
else:
r = mid - 1
return l
Java
法1:二分查找
注意:寻找完边界后,要判断两者是否合法!!!
class Solution {
public int[] searchRange(int[] nums, int target) {
if (nums.length == 0) {
return new int[]{-1, -1};
}
int leftBound = findLeftBound(nums, target, 0, nums.length - 1);
int rightBound = findRightBound(nums, target, 0, nums.length - 1);
if (leftBound <= rightBound) {
return new int[]{leftBound, rightBound};
}
return new int[]{-1, -1};
}
public int findLeftBound(int[] nums, int target, int left, int right) {
int mid = 0;
while (left <= right) {
mid = left + (right - left) / 2;
if (nums[mid] >= target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return left;
}
public int findRightBound(int[] nums, int target, int left, int right) {
int mid = 0;
while (left <= right) {
mid = left + (right - left) / 2;
if (nums[mid] <= target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return right;
}
}
排序数组中用二分查找元素首尾位置
博客围绕在排序数组中查找元素的第一个和最后一个位置展开,介绍了使用二分查找的方法,分别给出了Python和Java代码示例,同时提醒在寻找完边界后,要判断两者是否合法。

被折叠的 条评论
为什么被折叠?



