当前位置: 首页 > news >正文

python-Leetcode 65.搜索旋转排序数组

题目:

整数数组nums按升序排列,数组中的值互不相同

在传递给函数之前,nums在预先未知的某个小标K上进行了旋转,使数组变为[nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]],小标从0开始计数。例如[0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

给定旋转后的数组nums和一个整数target,如果nums中存在这个目标值target,则返回它的小标,否则返回-1


方法一:二分查找

对于有序数组,可以使用二分查找的方法查找元素

这道题中,数组本身不是有序的,进行旋转后只保证了数组的局部是有序的

可以发现,将数组从中间分开成左右两部分,一定有一部分的数组是有序的,拿示例看,从 6 这个位置分开以后数组变成了 [4, 5, 6] 和 [7, 0, 1, 2] 两个部分,其中左边 [4, 5, 6] 这个部分的数组是有序的,其他也是如此。

这启示我们,可以在常规二分查找的时候查看当前mid为分割位置分割出来的两个部分[l, mid] 和 [mid + 1, r]哪个部分是有序的并根据有序的那个部分确定该如何改变二分查找的上下界,因为可以根据有序的部分判断出target在不在这个部分。

如果 [l, mid - 1] 是有序数组,且 target 的大小满足 [nums[l],nums[mid]),应该将搜索范围缩小至 [l, mid - 1],否则在 [mid + 1, r] 中寻找

如果 [mid, r] 是有序数组,且 target 的大小满足 (nums[mid+1],nums[r]],则我们应该将搜索范围缩小至 [mid + 1, r],否则在 [l, mid - 1] 中寻找。

class Solution(object):
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        if not nums:  #如果输入数组为空,直接返回-1表示未找到
            return -1
        l,r=0,len(nums)-1  #初始化两个指针l(left)和r(right),分别指向数组的开始和结束位置
        while l<=r: #开始二分查找循环,当左指针不超过右指针时继续循环
            mid=(l+r)//2  #计算中间位置mid
            if nums[mid]==target: #如果中间值正好等于目标值,直接返回中间索引
                return mid
            if nums[0]<=nums[mid]:#检查数组的左半部分是否有序(旋转点在mid右侧)
                if nums[0]<=target<nums[mid]: #如果目标值在有序的左半部分范围内,将右指针移到mid左侧
                    r=mid-1
                else:
                    l=mid+1  #否则目标值在右半部分,将左指针移到mid右侧
            else: #如果左半部分无序(旋转点在mid左侧),则右半部分必定有序
                if nums[mid]<target<=nums[len(nums)-1]:#如果目标值在有序的右半部分范围内,将左指针移到mid右侧
                    l=mid+1
                else:    #否则目标值在左半部分,将右指针移到mid左侧
                    r=mid-1
        return -1

时间复杂度:O(logn),其中 n 为 nums 数组的大小。整个算法时间复杂度即为二分查找的时间复杂度 O(logn)

空间复杂度: O(1)

源自力扣官方题解
 


文章转载自:
http://aviator.apjjykv.cn
http://cadaverize.apjjykv.cn
http://avon.apjjykv.cn
http://backbend.apjjykv.cn
http://ahimsa.apjjykv.cn
http://arsonite.apjjykv.cn
http://alumni.apjjykv.cn
http://bellyhold.apjjykv.cn
http://carbonyl.apjjykv.cn
http://bethought.apjjykv.cn
http://ague.apjjykv.cn
http://burke.apjjykv.cn
http://ceanothus.apjjykv.cn
http://biafran.apjjykv.cn
http://cancerate.apjjykv.cn
http://agrostology.apjjykv.cn
http://bepelt.apjjykv.cn
http://aneurismal.apjjykv.cn
http://caspian.apjjykv.cn
http://astatically.apjjykv.cn
http://cashaw.apjjykv.cn
http://antipsychiatry.apjjykv.cn
http://catabaptist.apjjykv.cn
http://anachronistic.apjjykv.cn
http://armored.apjjykv.cn
http://charlatanism.apjjykv.cn
http://black.apjjykv.cn
http://almemar.apjjykv.cn
http://babblingly.apjjykv.cn
http://bogged.apjjykv.cn
http://www.dtcms.com/a/119897.html

相关文章:

  • 知识表示方法之六:过程表示法(Procedural Representation)
  • 【AI】prompt engineering
  • 组播网络构建:IGMP、PIM 原理及应用实践
  • Java Arrays工具类详解
  • 2025 年福建交安安全员考试:结合本省交通特点备考​
  • 大模型ui设计SVG输出
  • STM32——I2C通讯(软件模拟)
  • 解决 Jetpack Compose 中 State 委托报错:“no method getValue“ 的终极指南
  • 通用接口函数注册模块设计与实现
  • virt-manager配置NAT
  • PPIO × UI-TARS:用自然语言操控电脑,AI Agent 的极致体验
  • 宝塔面板面试内容整理-宝塔面板插件系统
  • RBAC 权限控制:深入到按钮级别的实现
  • geoserver搭建Docker一键直接安装并上传tif影像预览
  • Java 集合有序性与重复性总结及记忆技巧
  • TreeMap 核心知识点与面试题解析
  • Docker 核心组件
  • 【教学类-102-03】自制剪纸图案(留白边、沿线剪)03——Python制作白色描边和黑点虚线间隔(透明png图片)
  • 【Introduction to Reinforcement Learning】翻译解读4
  • KWDB创作者计划—边缘计算:从概念到落地的技术解读
  • 荣耀90 GT信息
  • 【微机及接口技术】- 第八章 可编程并行接口
  • 软考中级-软件设计师 2023年上半年下午题真题解析:通关秘籍+避坑指南
  • R语言进行聚类分析
  • JBDC java数据库连接(2)
  • System V 信号量:控制进程间共享资源的访问
  • WPS JS宏编程教程(从基础到进阶)-- 第五部分:JS数组与WPS结合应用
  • 4.8学习总结 贪心算法+Stream流
  • 获取cookie的chrome插件:Get cookies.txt LOCALLY
  • 前端知识点---闭包(javascript)