哈哈这是数学题,考虑到数组有序而且等数组中target数字可能有n个,二分查找过程当中,如果数组中出现等于target的数且该数的前一个数小于target,那说明我们要找那个target的下标就是我们要找的。如果找到的target数等于target,但是它前一个数等于target的也当作大于target来处理,就和普通的二分查找处理是一致的。 还要注意是否是空数组和找不到等于target数字的情况 下边是代码处理
int lo, mid, hi;
if (!numsLen)
return -1;
mid = numsLen / 2;
lo = 0;
hi = numsLen;
while (mid > 0) {
if ((nums[mid] == target) && (nums[mid - 1] < target)) {
return mid;
} else if (nums[mid] >= target) {
hi = mid;
mid = (lo + hi) / 2;
} else {
lo = mid;
mid = (lo + hi) / 2;
}
if ((lo == hi) && (nums[mid] != target))
return -1;
}
return (nums[mid] == target) ? mid : -1;