请实现无重复数字的升序数组的二分查找
给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1
def binary_search(nums, target):
def search(left, right):
if left > right:
return -1
mid = (left + right) // 2
if nums[mid] == target:
return mid
elif nums[mid] > target:
return search(left, mid - 1)
else:
return search(mid + 1, right)
return search(0, len(nums) - 1)
nums = [1,2,3,5,7,9]
target = 7
print(binary_search(nums, target))
target = 4
print(binary_search(nums, target))
特别特别需要注意的一个地方,自己做题的时候就这个地方没有通过。即如果数组是int[] array = {1,2,2,3,4};我们查找元素为2的下标,因为2号元素也是2,所以返回的就是2,而不是我们想要的1,所以我们要把nums[mid] 和nums[mid - 1]做一个比较
else if(nums[mid] == target){
while(mid != 0 && nums[mid] == nums[mid - 1])
mid--;
return mid;
}
public class Main {
public static void main(String[] args) {
int[] array = {1,2,2,3,4};
System.out.println(search(array, 2));
}
public static int search (int[] nums, int target) {
if(nums == null || nums.length == 0){
return -1;
}
// write code here
int left = 0;
int right = nums.length-1;
while(left<=right){
int mid = (left+right)/2;
if(nums[mid]>target){
right = mid -1;
}else if(nums[mid]<target){
left = mid + 1;
}else if(nums[mid] == target){
while(mid != 0 && nums[mid] == nums[mid - 1])
mid--;
return mid;
}
}
return -1;
}
}