leetcode 二分查找

排序数组中的问题,可以考虑用二分查找来解决,降低时间复杂度。

二分查找经典框架:#35.注意几个细节:while的条件是left=<right,而不是left<right(当然也有视情况具体决定;while里先写mid,且mid=(left+right)/2;无论是往左还是往右缩小范围,都要避过mid,即left=mid-1,right=mid+1(当然也有视情况而定,有的就不用避过并保留mid);返回结果时返回left还是right都行,因为while的终止条件是left<=right,最后两边界相等,返回哪个都一样;

在排序数组中,数字可以重复,问某一target第一次出现时的index以及最后一次出现时的index:

方法1⃣️经典的二分查找框架加上一个boolean flag,可以变成:当flag为true时,找到target在范围中第一次出现的位置,当flag为false时,找到target在范围中最后一次出现的位置。(#34)

方法2⃣️由于是排序数组,可以通过一般的二分查找加上把nums[mid]==tar这种情况归到小于/大于的某一边可以找到某数第一次出现的位置或最后一次出现的位置。找到target第一次出现的位置以及target+1第一次出现的位置-1;或是找到target最后一次出现的位置和target-1最后一次出现的位置(#剑指offer53-1)

在一个已告知的范围内去查找某数都可以用二分

明确 while(left <= right) 和 while(left < right) 这两种写法其实在思路上有本质差别:while(left <= right) 在循环体内部直接查找元素,而 while(left < right) 在循环体内部一直在排除元素

使用 while (left < right) 与 right = mid; 和 left = mid + 1; 配对的写法是为了保证退出循环以后 left 与 right 重合;而while(left <= right)与right = mid-1和 left = mid + 1配对。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值