Leetcode算法Java全解答–34. 在排序数组中查找元素的第一个和最后一个位置
文章目录
题目
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 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]
想法
无限中分,找到目标值的位置(targetIndex)
根据targetIndex往左右2遍扩散
左边就是最小值,右边就是最大值
结果
超过75%的测试案例
时间复杂度/空间复杂度: log n/ 1
总结
代码
我的答案
public int[] searchRange(int[] nums, int target) {
if(nums.length==0){
return new int[]{-1,-1};
}
int left = 0;
int right = nums.length;
int mid = (left+right)/2;
int targetIndex = -1;
while(left<right){
if(nums[mid]>target){
if(right == mid) break;
right = mid;
mid = (left + right) /2 ;
}else if(nums[mid]<target){
if(left == mid) break;
left = mid;
mid = (left + right) /2 ;
}else{
targetIndex = mid;
break;
}
}
if (targetIndex == -1) {
return new int[]{-1, -1};
} else {
int a = targetIndex, b = targetIndex;
while (a > 0 && nums[a - 1] == target) a--;
while (b < nums.length - 1 && nums[b + 1] == target) b++;
return new int[]{a, b};
}
}
大佬们的答案
public int[] searchRange(int[] nums, int target) {
int[] result = new int[] { -1, -1 };
if (null == nums || nums.length == 0) {
return result;
}
int pos = findPos(nums, target, 0, nums.length);
if (pos == -1) {
return result;
}
result[0] = testPosL(nums, target, 0, pos);
result[1] = testPosR(nums, target, pos, nums.length - 1);
return result;
}
public int findPos(int[] nums, int target, int start, int end) {
int pos = start + (end - start) / 2;
if (null == nums || nums.length == 0 || start >= end) {
return -1;
}
int m = nums[pos];
if (m == target) {
return pos;
}
if (m > target) {
return findPos(nums, target, start, pos);
} else {
return findPos(nums, target, pos + 1, end);
}
}
private int testPosL(int[] nums, int target, int l, int r) {
int m;
while (l < r) {
m = (l + r) / 2;
if (nums[m] < target) {
l = m + 1;
} else {
r = m;
}
}
if (l < 0 || l > nums.length - 1 || nums[l] != target)
return -1;
return l;
}
private int testPosR(int[] nums, int target, int l, int r) {
int m;
while (l <= r) {
m = (l + r) / 2;
if (nums[m] > target) {
r = m - 1;
} else {
l = m + 1;
}
}
if (r < 0 || r > nums.length - 1 || nums[r] != target)
return -1;
return r;
}
测试用例
其他
代码托管码云地址:https://gitee.com/lizhaoandroid/LeetCodeAll.git
查看其他内容可以点击专栏或者我的博客哈:https://blog.csdn.net/cmqwan
“大佬们的答案” 标签来自leetcode,侵权请联系我进行删改
如有疑问请联系,联系方式:QQ3060507060