Leetcode704 二分查找(数组)
# 这里是二分查找题目当中 只给出了 n个 升序 整型 数组nums目标变量名称是 target# 要求 存在返回 下标不存在 返回 -1时间复杂度O(logn)class Solution(object):def search(self, nums, target)::type nums: List[int]:type target: int:rtype: int#首先 一开始我想着 用 left right 去定义 边界 当满足 条件 进入 循环 去 查找 target# 但是 这样的话 会 出现 到底 能不能left right 呢# 所以 因为数组 是个什么样子的开 闭不知道 并未 明确说明 四种 情况# 考虑 左闭右闭左闭右开或者 左开右闭或者 左开右开# 然后 思考 正是 因为 由于 数组条件不确定 造成的 代码中 两个 判断 不同点 主要 是 在# 1. 到底 能不能left right# 2. 边界 要不要 等于 中间 索引 呢#所以 这里 我们 分情况 讨论# 然后 二分 查找 需要 表示 中间值一开始 我想着 用left right 表示 具体的 值但是这样 后面 会 边界移动# 所以 应该是 left right 表示 索引利用 索引 取值# todo 1. 假设 是 左闭右闭# 可以 等于 当 left right时while循环 直到 找到 符合 条件的 否则 找不到返回 -1#之所以 while 因为 要一直 迭代 并不知道 具体次数while left right:mid left (right - left) // 2if targetnums[mid]:return midelif targetnums[mid]:right mid -1# 因为 我们已经判断了 目标值 小于 中间值 那么 移动 右边界# 要不要 取到 中间的 数 呢 因为 是闭区间中间的值 不是 我们 想要的 所以 不取# 直接 再往左 取到 左边的 一个数 即可else :left mid 1return -1# todo 2. 假设 左闭 右 开class Solution(object):def search(self, nums, target):left, right 0, len(nums)#这里 左闭 右开 如果 leftright 与题目 相悖while left right:mid left (right - left) // 2if targetnums[mid]:return midelif targetnums[mid]:rightmid# 因为是开区间,我们的目标值 在左侧 右边 开区间 取不到 右边的值 同时 中间 索引的 值 不是 我们想要的# 所以 直接 右边界 等于 中间的 索引 即可# 如果 往左 一个数 又是 开区间 取不到 相当于 我们 把 左一个的数 丢掉了else :leftmid 1return -1# # 犯错点# 1. 边界条件当区间 开闭不同 时 用于 表示 索引的 数值 不同# 2.不能用 固定的 字母 表示 数组 中的 数字 因为 要考虑 边界 的 移动 数字 在 不断 变换# 3.如果 target 存在返回下标,我一开始 写成 返回数值了
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2525709.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!