请实现有重复数字的升序数组的二分查找
给定一个 元素有序的(升序)长度为n的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的第一个出现的target,如果目标值存在返回下标,否则返回 -1
数据范围:
进阶:时间复杂度
,空间复杂度%5C)
[1,2,4,4,5],4
2
从左到右,查找到第1个为4的,下标为2,返回2
[1,2,4,4,5],3
-1
[1,1,1,1,1],1
0
在普通二分查找基础上,增加一个往左寻找第一个出现的位置即可
int search(int* nums, int numsLen, int target ) {
// write code here
if(numsLen==0) return -1;
int left=0, right=numsLen-1;
while(left<=right) {
int mid = left+(right-left)/2;
if(nums[mid]==target) {
while(nums[mid]==target) {
mid--;
}
return mid+1;
}
if(nums[mid]<target) left=mid+1;
if(nums[mid]>target) right=mid-1;
}
return -1;
}
int search(int* nums, int numsLen, int target )
{
int zuo=0;
int you=numsLen-1;
int zhong=0;
while(zuo<=you)
{
zhong=(zuo+you)/2;
if(nums[zhong]<target)
{
zuo=zhong+1;
}
else if(nums[zhong]>target)
{
you=zhong-1;
}
else
{
int t=zuo;
while(nums[t]!=target)
{
t++;
}
return t;
break;
}
}
return -1;
} nt search(int* nums, int numsLen, int target ) {
// write code here
int i = 0;
int right = numsLen-1;
int left = 0;
int j = 0;
while(left<=right)
{
i = (right+left)/2;
if(nums[i]<target)
{
left = i+1;
}
else if(nums[i]>target)
{
right = i-1;
}
else
{
int j = i;
while(nums[j-1] == target)
{
j--;
}
return j;
}
}
return -1;
} int cond(int* nums, int mid, int target) {
return *(nums + mid) >= target;
}
int binary_search(int* nums, int numsSize, int target, int (*cond) (int*, int, int)) {
int l = 0, r = numsSize, m;
while (l < r) {
m = l + ((r - l) >> 1);
if (cond(nums, m, target)) r = m;
else l = m + 1;
}
return l;
}
int search(int* nums, int numsLen, int target) {
int index = binary_search(nums, numsLen, target, cond);
if (index == numsLen || *(nums + index) > target)
return -1;
return index;
}