给定一个按照升序排列的整数数组 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) {
ArrayList<Integer> temp = new ArrayList<>();
boolean sign = false;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == target) {
sign = true;
break;
}
}
if (sign == false) {
int result1[] = {-1, -1};
return result1;
}
//第一个
int location = binarySearch(nums, target);
int pre = location;
int rear = 0;
while (nums[location] == target) {
rear = location;
location++;
if (location == nums.length) {
break;
}
}
temp.add(pre);
temp.add(rear);
if (temp.size() == 1) {
int result2[] = {temp.get(0), temp.get(0)};
return result2;
}
int result2[] = new int[temp.size()];
for (int i = 0; i < temp.size(); i++) {
result2[i] = temp.get(i);
}
return result2;
}
// 二分查找
public int binarySearch(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
int location = 0;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] >= target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return left;
}
2021.4.3 在排序数组中查找元素的第一个和最后一个位置
原文:https://www.cnblogs.com/spx88/p/14655479.html