给定一个按照升序排列的整数数组 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]来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
依旧是很简单的问题,我是冲着OlogN的算法来的,所以就直接贴OlogN的算法了。
先通过二分法,找到target,然后定位target,在它的左边和右边搜索,核心代码就是
while(i!=(zuojiexian+youjiexian)/2){
i=(zuojiexian+youjiexian)/2;
if(nums[i]<target) //说明target存在的话就在中位数的左边
zuojiexian=i;
else if (nums[i]>target) //说明target存在的话就在中位数的右边
youjiexian=i;
else{
for(int j=i;j>=-1;j--)
if(j==-1||nums[j]!=target ) {search[0]=j+1;break;}
for(int j=i;j<=nums.length;j++)
if(j==nums.length||nums[j]!=target) {search[1]=j-1;break;}
return search;
}
}
return search;
最后附上结果
class Solution {
public int[] searchRange(int[] nums, int target) {
int zuojiexian=0;int youjiexian=nums.length;
int i=-1;
int[] search =new int[]{-1,-1};
if (nums.length==1) {if (target==nums[0]) return new int[]{0,0};
else return search;}
if(nums.length==0) return search;
while(i!=(zuojiexian+youjiexian)/2){
i=(zuojiexian+youjiexian)/2;
if(nums[i]<target) //说明target存在的话就在中位数的左边
zuojiexian=i;
else if (nums[i]>target) //说明target存在的话就在中位数的右边
youjiexian=i;
else{
for(int j=i;j>=-1;j--)
if(j==-1||nums[j]!=target ) {search[0]=j+1;break;}
for(int j=i;j<=nums.length;j++)
if(j==nums.length||nums[j]!=target) {search[1]=j-1;break;}
return search;
}
}
return search;
}
}