实现无重复数字的升序数组的二分查找

请实现无重复数字的升序数组的二分查找

给定一个 元素升序的、无重复数字的整型数组 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))
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7666026
  • 你也可以参考下这篇文章:二分查找(给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。)
  • 除此之外, 这篇博客: 请实现有重复数字的升序数组的二分查找中的 给定一个 元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 特别特别需要注意的一个地方,自己做题的时候就这个地方没有通过。即如果数组是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;
        }
    }
    
    
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632