题目描述
请实现有重复数字的升序数组的二分查找
给定一个 元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的第一个出现的target,如果目标值存在返回下标,否则返回 -1
示例一
输入:[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 mid = left + (right - left) / 2; 比(left + right)/ 2写更好,避免因为left 和 right两个值过大溢出,所以先减掉除2再加上小值
public int search (int[] nums, int target) {
// write code here
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
while (mid > 0) {
mid--;
if (nums[mid] != target) {
return mid + 1;
}
}
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
}
}
return -1;
}
复杂度分析
- 时间复杂度:O(logN)。
- 空间复杂度:O(1)。