2021.4.3 在排序数组中查找元素的第一个和最后一个位置

给定一个按照升序排列的整数数组 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;
}
posted @ 2021-04-13 21:42  spx88  阅读(64)  评论(0编辑  收藏  举报