LeetCode34. 在排序数组中查找元素的第一个和最后一个位置
LeetCode34. 在排序数组中查找元素的第一个和最后一个位置
解法1
1 算法
- 算法
- 1.两次二分查找
- 2.第一次二分查找计算
mid=(left + right) >> 1;
,每次mid都偏向左边,可以保证找到的是第一个大于等于target的元素 - 3.第二次二分查找计算
mid=((left + right) >> 1) + 1;
,每次mid都偏向右边,可以保证找到的是第一个小于等于target的元素- 可以利用第一次二分查找的结果left缩小第二次二分查找的范围,而不用left = 0
2 Java
public int[] searchRange(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return new int[]{-1, -1};
}
int[] result = new int[]{-1, -1};
int left = 0, right = nums.length - 1;
while (left < right) {
int mid = (left + right) >> 1;
if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid;
}
}
if (nums[left] == target) {
result[0] = left;
} else {
return result;
}
right = nums.length - 1;
while (left < right) {
int mid = ((left + right) >> 1) + 1;
if (nums[mid] > target) {
right = mid - 1;
} else {
left = mid;
}
}
result[1] = right;
return result;
}
3 Go
func searchRange(nums []int, target int) []int {
if nums == nil || len(nums) == 0 {
return []int{-1, -1}
}
result := make([]int, 2)
left, right := 0, len(nums) - 1
for left < right {
mid := (left + right) >> 1
if nums[mid] < target {
left = mid + 1
} else {
right = mid
}
}
if nums[left] == target {
result[0] = left
} else {
return []int{-1, -1}
}
right = len(nums) - 1
for left < right {
mid := (left + right) >> 1 + 1
if nums[mid] > target {
right = mid - 1
} else {
left = mid
}
}
result[1] = right
return result
}
解法2
1 算法
- 算法
- 1.二分查找
- 2.首先查找前先看有序数组中最小和最大的元素与target的关系,有可能不用查找直接返回{-1, -1}
- 3.然后使用二分查找到第一个大于等于target的元素
- 3.1 如果这个元素不等于target,返回{-1, -1}
- 3.2 如果这个元素等于target,再遍历找到最后一个target的位置,最后返回即可
2 Java
public int[] searchRange(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return new int[]{-1, -1};
}
int left = 0, right = nums.length - 1;
if (nums[left] > target || nums[right] < target) {
return new int[]{-1, -1};
}
while (left < right) {
int mid = (left + right) >> 1;
if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid;
}
}
if (nums[left] == target) {
for (right = left; right < nums.length; right++) {
if (nums[right] != target) {
break;
}
}
return new int[]{left, right-1};
} else {
return new int[]{-1, -1};
}
}
3 Go
func searchRange(nums []int, target int) []int {
if nums == nil || len(nums) == 0 {
return []int{-1, -1}
}
left, right := 0, len(nums) - 1
if nums[left] > target || nums[right] < target {
return []int{-1, -1}
}
for left < right {
mid := (left + right) >> 1
if nums[mid] < target {
left = mid + 1
} else {
right = mid
}
}
if nums[left] == target {
for right = left; right < len(nums); right++ {
if nums[right] != target {
break
}
}
return []int{left, right - 1}
} else {
return []int{-1, -1}
}
}