LeetCode刷题系列—34. Find First and Last Position of Element in Sorted Array
1.题目描述
英文版:
Given an array of integers nums sorted in ascending order,
find the starting and ending position of a given target value.
Your algorithm's runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1].
Example 1:
Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]
Example 2:
Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]
中文版:
有一个按序升序的整型数组,
寻找第一个和最后一个出现的目标值的位置。
算法的时间复杂度必须是O(log n).
在数组中如果没找到则返回[-1,-1].
例 1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
例 2:
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
2.解法
2.1 解法1
思路:
这道题目为二分查找的变型题。这里分别用两次循环找出第一个等于target的数的位置和最后一个等于target的数的位置。
1)等于的时候,如果当前为第一个元素或者当前元素的前一个元素不等于target,则当前元素第一个等于target的数,否则继续往前找。
2)等于的时候,当前为最后一个元素或者当前元素的后一个元素不等于target,则当前元素最后一个等于target的数,否则继续往后找。
public static int[] searchRange(int[] nums, int target) {
int result[] = {-1,-1};
int left = 0;
int right = nums.length - 1;
while (left <= right){ //寻找第一个等于target的数
int middle = left + (right - left) / 2;
if(target > nums[middle]){
left = middle + 1;
}else if(target < nums[middle]){
right = middle - 1;
}else { //等于的时候
//如果当前为第一个元素或者当前元素的前一个元素不等于target
//则当前元素第一个等于target的数
//否则继续往前找
if(middle == 0 || nums[middle-1] != target){
result[0] = middle;
break;
}else{
right = middle - 1;
}
}
}
right = nums.length - 1;
while (left <= right){ //寻找最后个等于target的数
int middle = left + (right - left) / 2;
if(target > nums[middle]){
left = middle + 1;
}else if(target < nums[middle]){
right = middle - 1;
}else { //等于的时候
//如果当前为最后一个元素或者当前元素的后一个元素不等于target
//则当前元素最后一个等于target的数
//否则继续往后找
if (middle == nums.length - 1 || nums[middle + 1] != target){
result[1] = middle;
break;
}else {
left = middle + 1;
}
}
}
return result;
}
在LeetCode上运行的结果:

3.测试
在本地,我只是简单写了一个main函数来对它进行测试。但是这些代码都是在LeetCode上运行通过了的。
public static void main(String[] args) {
int[] nums = {5,7,7,8,8,10};
int target = 8;
int[] result = searchRange(nums,target);
Arrays.stream(result).forEach(System.out::println);
}
欢迎关注个人公众号,可直接扫描以下二维码或微信搜索“阿毛聊技术”。


浙公网安备 33010602011771号