给定一个按照升序排列的整数数组 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]
思路:二分查找
提交的代码:
class Solution {
public int[] searchRange(int[] nums, int target) {
int low=0,high=nums.length-1,mid=-1,flag=1;
while(low<=high)
{
mid = (low+high)/2;
if(nums[mid]==target)
{
flag=0;
break;
}
else if(nums[mid]>target)
{
high = mid-1;
}
else
{
low = mid +1;
}
}
int arr[] = new int[2];
if(nums.length==1&&target==nums[0])
{
arr[0]=0;
arr[1]=0;
return arr;
}
if(flag==1)
{
arr[0]=-1;
arr[1]=-1;
return arr;
}
else
{
arr[0] = mid;
arr[1] = mid;
for(int i=mid;i>=0;i--)
{
if(nums[i]==nums[mid])
{
arr[0] = i;
}
}
for(int i=mid;i<nums.length;i++)
{
if(nums[i]==nums[mid])
{
arr[1] = i;
}
}
return arr;
}
}
}
完整的代码:
public class Solution34 {
public static int[] searchRange(int[] nums, int target) {
int low=0,high=nums.length-1,mid=-1,flag=1;
while(low<=high)
{
mid = (low+high)/2;
if(nums[mid]==target)
{
flag=0;
break;
}
else if(nums[mid]>target)
{
high = mid-1;
}
else
{
low = mid +1;
}
}
int arr[] = new int[2];
if(nums.length==1&&target==nums[0])
{
arr[0]=0;
arr[1]=0;
return arr;
}
if(flag==1)
{
arr[0]=-1;
arr[1]=-1;
return arr;
}
else
{
arr[0] = mid;
arr[1] = mid;
for(int i=mid;i>=0;i--)
{
if(nums[i]==nums[mid])
{
arr[0] = i;
}
}
for(int i=mid;i<nums.length;i++)
{
if(nums[i]==nums[mid])
{
arr[1] = i;
}
}
return arr;
}
}
public static void main(String[] args)
{
int nums[] = {5,7,7,8,8,10};
int target = 8;
int a[] = new int[2];
a=searchRange(nums,target);
for(int i =0;i<2;i++)
{
System.out.println(a[i]);
}
}
}