前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >二分查找实践

二分查找实践

作者头像
公众号guangcity
发布2019-09-20 14:00:27
2990
发布2019-09-20 14:00:27
举报
文章被收录于专栏:光城(guangcity)光城(guangcity)

二分查找实践

0.说在前面1.二分查找实现2.搜索旋转排序数组2.1 问题2.2 思想3.非递归实现4.递归实现5.作者的话

0.说在前面

本周还差一次leetcode刷题,今日补上,今天刷的题为搜索旋转排序数组,实现方式采用递归与非递归实现!下面一起来实践吧!

1.二分查找实现

二分查找概念不阐述了,这里直接来做实现,为后面的题目做准备!

代码语言:javascript
复制
class BS:
    def search(self,nums,target):
        return self.bsearch(nums,0,len(nums)-1,target)
    def bsearch(self,nums,low,high,target):
        while(low<=high):
            mid = (low+high)//2
            if nums[mid] == target:
                return mid
            elif nums[mid] < target:
                low=mid+1
            elif nums[mid] > target:
                high=mid-1
        return None
nums = [9,5,7,0,1,2,3,12]
target = 0
bs = BS()
print(bs.search(nums,target))

2.搜索旋转排序数组

2.1 问题

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1

你可以假设数组中不存在重复的元素。

你的算法时间复杂度必须是 O(log n) 级别。

示例 1:

代码语言:javascript
复制
输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4

示例 2:

代码语言:javascript
复制
输入: nums = [4,5,6,7,0,1,2], target = 3
输出: -1

2.2 思想

如果中间值大于最左边值,表示中间值与左边在一个递增序列中,此时只需要判断一下target是否在左边与中间这个区间,这就变成了一个标准的递增排序数组查找!

如果中间值小于左边值,表示中间值肯定在右边的一个递增序列中,此时只需要判断一下target是不是在中间与右边这个区间,这就变成了一个标准的递增排序数组查找!

3.非递归实现

思想上面阐述了,下面来实现!

代码语言:javascript
复制
def search(self, nums, target):
        low = 0
        high = len(nums)-1
        mid = (low + high)//2
        while low<=high:
            if nums[mid] == target:
                return mid
            elif nums[mid]>=nums[low]:
                if nums[mid] >= target and target >= nums[low]:
                    high = mid - 1
                else:
                    low = mid + 1
            elif nums[mid]<nums[low]:
                if nums[mid] <= target and target <= nums[high]:
                    low = mid + 1
                else:
                    high = mid - 1 
            mid = (low + high)//2
        return -1

4.递归实现

下面设置十万次,原因是因为python递归会有限制,所以设置多一点,就不会出问题!对比这两段代码,核心基本是一致的!

代码语言:javascript
复制
def search(self, nums, target):
    import sys
    sys.setrecursionlimit(100000)  # 这里设置为十万
    return self.zheban(nums, target, 0, len(nums) - 1)

def zheban(self, nums, target, low, high):
    if high < low:
        return -1
    mid = (low + high) // 2
    if nums[mid] == target:
        return mid
    if nums[mid] >= nums[low]:
        if nums[mid] >= target and target >= nums[low]:
            return self.zheban(nums, target, low, mid - 1)
        else:
            return self.zheban(nums, target, mid + 1, high)
    else:
        if nums[mid] <= target and target <= nums[high]:
            return self.zheban(nums, target, mid + 1, high)
        else:
            return self.zheban(nums, target, low, mid - 1)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 光城 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二分查找实践
    • 0.说在前面
      • 1.二分查找实现
        • 2.搜索旋转排序数组
          • 2.1 问题
          • 2.2 思想
        • 3.非递归实现
          • 4.递归实现
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档