Найти интервал
34. Найти первый и последний Положение элемента в отсортированном массиве
Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]
Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]
Тема Описание:
Подсчитайте количество раз число, которое появляется в массиве сортировки.
Анализ идей:
Этот вопрос известен под названием принадлежит отсортировать массив, чтобы найти проблему, то мы сначала думали, это бинарный поиск. Из-за того, сколько раз, чтобы найти число, которое появляется в массиве сортировки, мы просто убедитесь, что место и положение последнего вхождения первого вхождения этого числа таким образом, мы можем вычислить, сколько раз он появляется в массиве. Бинарный алгоритм поиска, чтобы сделать первый промежуточный цифровой и K массива для сравнения, если число больше, чем в середине К, то нам просто необходимо найти следующий раунд первого полупериода. Если меньше K, то мы рассмотрим во второй половине. Если K равно, что мы должны определить, что это не первый K K, прежде, чем мы должны видеть, является ли число K, если нет, то среднего числа является первым K, если предыдущее число K, то первым K, конечно, мы рассмотрим в первой половине предыдущего пункта, на следующем этапе массива. Же предпринять, чтобы найти последний K первый промежуточный массив цифровых и K для сравнения, если число больше, чем в середине К, то нам просто необходимо найти следующий раунд первого полупериода. Если меньше K, то мы рассмотрим во второй половине. Если равно K, что мы должны определить K не последний K, то мы должны смотреть после того, как число не является K, если нет, то число промежуточных и конечных K, если число K, то последний K конечно, после половины, на следующем этапе массива мы рассмотрим во второй половине.
Код:
public int[]searchRange(int []nums,int target){
if(nums==null||nums.length==0)
return null;
int first=0;
int last=0;
first=getFirst(nums,0,nums.length-1,target);
last=getLast(nums,0,nums.length-1,target);
if(first>-1&&last>-1){
return new int[]{first,end};
}
return null;
}
public int getFirst(int []nums,int l,int h,int target){
if(l>h)
return -1;
int mid=l+(h-l)/2;
if(nums[mid]==target){
if(mid>0&&nums[mid-1]!=target||mid==0){
return mid
}else{
h=mid-1;
}
}else if(nums[mid]>target){
h=mid-1;
}else{
l=mid+1;
}
return getFirst(nums,l,h,target);
}
public int getLast(int []nums,int l,int h,int target){
if(l>h)
return -1;
int mid=l+(h-l)/2;
if(nums[mid]==target){
if(mid<nums.length-1&&nums[mid+1]!=target||mid==nums.length-1){
return mid;
}else{
l=mid+1;
}
}else if(nums[mid]>target){
h=mid-1;
}else{
l=mid+1;
}
return getLast(nums,l,h,target);
}