Leetcode Blind 75 | Find minimum & Search in rotated sorted array

1. Find Minimum in Rotated Sorted Array
 

  • 给定一个数组经过n次旋转后找出最小值,数组预先升序排

a. 思路

  • 切入:时间复杂度 O(logn)-->二分法:左右两端、中间指针-->涉及比较
  • 数组特性:即使数组被旋转,它的两个子数组(旋转点分隔的两部分)仍然是升序的--->决定比较结果,指针移动方向
  • 核心:比较中间元素与左/右端点的大小关系 (根据从左往右的习性,就比较左端点好了)

    • 如果 [mid] > [left],
      • 说明中间元素与其前面的元素是按照升序排列的,是左排序的一部分,那么下一步就是往右边找最小值
    • 如果 [mid] < [left],
      • 意味中间指针属于右排序,越往右越大,我们不确定中间指针是否位于右排序最左,所以指针往左移动

  • 边缘:
    • 数组存在重复元素(题干排除)
    • 数组未经旋转/完全升序时,最左即最小值---while循环优化:在二分查找前检查数组是否已经升序-->if nums[l] < nums[r],减少不必要的二分查找迭代

b. Coding

输入:给定数组nums

输出:最小值 res

变量:

最小值res

二分法下标:left,right,mid

算法/语句:

  1. 初始化结果和下标变量
    1. 初始化结果为数组第一个元素,在完全升序情况下,第一个即最小值 res=nums[0]
    2. 初始化下标表示搜索范围 left, right = 0, len(nums)-1
  2. while循环移动下标直到返回结果
    1. 跳出循环条件:left > right
    2. 检查数组是否已是升序
      1. if 语句将最小值res与现搜索范围内的最左比较
      2. bresk 退出循环,返回结果
    3. 二分查找
      1. 计算中间位置 mid
      2. 更新res
        1. 为了代码的可读性和逻辑清晰,我们倾向于在可能改变变量值之前立即更新所需要的值
        2. 把此语句放在 if-else后面不会影响结果,因为mid位置不变,left和right更新不会影响min()的搜查范围
      3. 比较中间值和左断电大小关系
        1. if
        2. else
  3. return res
class Solution(object):
    def findMin(self, nums):
        res = nums[0]
        left, right = 0, len(nums)-1

        while left <= right:
            if nums[left]<nums[right]:
                res = min(nums[left], res)
                break
            
            mid = (left+right)//2
            res = min(res,nums[mid])
            if nums[mid]>=nums[left]:
                left = mid+1
            else:
                right = mid-1
        return res

2. Search in rotated sorted array

a. 思路

旋转数组可以看作是分段函数的简化版本,其中每一段都是有序的

【mid可能在上也可能在下】

如果数组在枢纽点旋转,左端点>右端点,中间是断点、两个搜索区间-->二分法:

传统的二分搜索是在完全排序的数组中进行的,但在这个问题中,可以通过比较中间元素和区间端点来判断中间元素属于哪个排序的子数组

由此推彼,在未知旋转数组中,所有需要被确定的都是此图已有的特点:

  1. 确定中点:把数组分为两个部分的断点,但除了(left+right)/2外,不能可视化,所以只能从子数组升序这个特点入手
  2. 确定哪个子数是有序的:比较中点和端点
    1. nums[left] <= nums[mid]--->左排序
    2. nums[mid] < nums[right]--->右排序
  3. 确定target所在区间&调整搜索边界链接
    1. 左分段

      1. target在黄线外:target>nums[mid] 或 target< nums[left]:mid+1
      2. target在黄线上:nums[left] < target < nums[mid] : mid-1

b. 断点: target == mid

c. 右分段

      1. target在绿线外:target < nums[mid] 或 target>nums[right]:mid-1
      2. target 在绿线上:nums[mid] <target < nums[right]:mid+1

b. Coding

输入:给定数组nums

输出:target下标

变量:

    1. 二分法:left right mid
    2. 目标值target
    3. 给定数组 nums

算法/语句

  • 初始化二分法变量:lefy right
    • mid 随着left right 的变化而变化,所以在循环内部定义
  • while 循环
    • 判断条件:left <= right
      • leftright 相遇时,仍然会执行循环体内的代码,在循环内部检查 mid 是否等于 target
    • mid 定义
      • 断点
        • target == nums[mid]
      • 左分段
        • 黄线内外
      • 右分段
        • 绿线内外
  • 循环完了还没找到 return -1

c. 错误

每次确定搜索范围,都是靠移动左右两端left&right,不是左分段leftleft,右分段rightright,不要被语言迷惑

d. 优化

### 解决PyCharm无法加载Conda虚拟环境的方法 #### 配置设置 为了使 PyCharm 能够成功识别并使用 Conda 创建的虚拟环境,需确保 Anaconda 的路径已正确添加至系统的环境变量中[^1]。这一步骤至关重要,因为只有当 Python 解释器及其关联工具被加入 PATH 后,IDE 才能顺利找到它们。 对于 Windows 用户而言,在安装 Anaconda 时,默认情况下会询问是否将它添加到系统路径里;如果当时选择了否,则现在应该手动完成此操作。具体做法是在“高级系统设置”的“环境变量”选项内编辑 `Path` 变量,追加 Anaconda 安装目录下的 Scripts 文件夹位置。 另外,建议每次新建项目前都通过命令行先激活目标 conda env: ```bash conda activate myenvname ``` 接着再启动 IDE 进入工作区,这样有助于减少兼容性方面的问题发生概率。 #### 常见错误及修复方法 ##### 错误一:未发现任何解释器 症状表现为打开 PyCharm 新建工程向导页面找不到由 Conda 构建出来的 interpreter 列表项。此时应前往 Preferences/Settings -> Project:...->Python Interpreter 下方点击齿轮图标选择 Add...按钮来指定自定义的位置。按照提示浏览定位到对应版本 python.exe 的绝对地址即可解决问题。 ##### 错误二:权限不足导致 DLL 加载失败 有时即使指定了正确的解释器路径,仍可能遇到由于缺乏适当的操作系统级许可而引发的功能缺失现象。特别是涉及到调用某些特定类型的动态链接库 (Dynamic Link Library, .dll) 时尤为明显。因此拥有管理员身份执行相关动作显得尤为重要——无论是从终端还是图形界面触发创建新 venv 流程均如此处理能够有效规避此类隐患。 ##### 错误三:网络连接异常引起依赖下载超时 部分开发者反馈过因网速慢或者其他因素造成 pip install 操作中途断开进而影响整个项目的初始化进度条卡住的情况。对此可尝试调整镜像源加速获取速度或是离线模式预先准备好所需资源包后再继续后续步骤。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值