lintcode二分查找

给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1。

思路:

如果数组的中位数mid小于目标数字,则在数组的右侧right继续查找。
如果数组的中位数大于等于目标数字,则在数组的左侧left继续查找。
直到数组中左侧下标等于右侧下表。
mid=(left+right)/2;
这里写图片描述

复杂度:

1)时间复杂度:假设以最坏情况考虑,二分查找第一次在n/2中查找(n为元素个数);第二次在一半的一半中查找,即n/2/2=n/4;……第x次在n/2x范围内查找,即2x=n(x=log2n),所以时间复杂度为O(log2n).

2)空间复杂度:递归深度为N*每次递归的辅助空间大小,如果每次递归的辅助空间为常数,则空间复杂度为O(N)。
对于递归的二分查找,递归深度是log2n,每次递归的辅助空间为常数,所以空间复杂度为O(log2N)

int binarySearch(vector<int> &nums, int target) {
        int left = 0;
        int right = nums.size()-1;
        int mid = (left + right) / 2;
        while (left < right) {
            if (nums[mid] < target) left = mid + 1;
            if (nums[mid] >= target) right = mid;
            mid = (left + right) / 2;
        }
        return nums[mid] == target ? mid : -1;
        
    }

nums[mid] == target ? mid : -1;
若nums[mid] == target为真则执行mid;若条件不为真,执行-1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值