首页 > 其他分享 >蓝桥杯每日一练--搜索旋转排序数组

蓝桥杯每日一练--搜索旋转排序数组

时间:2024-11-05 18:47:38浏览次数:3  
标签:一练 right target nums -- 蓝桥 数组 目标值 left

目录

一、题目

二、分析

三、代码


一、题目

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

在传递给函数之前,nums 在预先未知的某个下标 k0 <= k < nums.length)上进行了 旋转,使数组变为 [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 。

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

输入:nums = [4,5,6,7,0,1,2], target = 0
输出:4

示例 2:

输入:nums = [4,5,6,7,0,1,2], target = 3
输出:-1

示例 3:

输入:nums = [1], target = 0
输出:-1

二、分析

我看到这道题的第一想法就是暴力求解,挨个遍历,但很不幸题目中要求了时间复杂度为 O(log n),因此该方法排除。其次,注意到logn的时间复杂度之后,我又想到了二分查找,但二分查找的前提在于要求数组有序排列,所以,我下意识地想到了先将该数组重整为有序数组,然后再使用二分查找,但是想将该数组重新排序,又要用的for循环,那么时间复杂度又将不符合题意。所以我意识到这道题是不是能直接使用二分查找来求解。在仔细分析题干之后,我总结出了解题思路:

  1. 将数组一分为二。(其中有一个一定是有序的;另一个则是无序或部分有序的)
     
  2. 此时如果target在有序部分里,则用二分法查找。
     
  3. 否则进入无序部分查找,继续二分。

总的来说就是一直二分查找,我们要做的就是控制好指针的变化即可。

三、代码

具体代码如下

def search(nums,target):
    left=0
    right=len(nums)-1
    while left<=right:
        mid=(left+right)//2
        if target==nums[mid]:
            return mid
        if nums[mid]>=nums[right]:
            if nums[left]<=target<=nums[mid]:
                right=mid-1
            else:
                left=mid+1
        else:
            if nums[mid]<=target<=nums[right]:
                left=mid+1
            else:
                right=mid-1
    return -1

nums = [4, 5, 6, 7, 0, 1, 2]
target = 0
print(search(nums, target))
target = 3
print(search(nums, target))
nums = [1]
target = 0
print(search(nums, target))

  1. 首先初始化两个指针 left 和 right 分别指向数组的首尾位置。
  2. 进入循环,只要 left 不超过 right,就继续循环。
    • 计算中间索引 mid
    • 如果中间元素等于目标值,直接返回中间索引。
    • 然后判断哪一部分是有序的:
      • 如果左半部分有序,并且目标值在左半部分范围内(大于等于 nums[left] 且小于 nums[mid]),说明目标值在左半部分,将 right 更新为 mid - 1
      • 否则目标值在右半部分,将 left 更新为 mid + 1
    • 如果左半部分无序,说明右半部分有序:
      • 如果目标值在右半部分范围内(大于等于 nums[mid] 且小于等于 nums[right]),说明目标值在右半部分,将 left 更新为 mid + 1
      • 否则目标值在左半部分,将 right 更新为 mid - 1
  3. 如果循环结束还没有找到目标值,返回 -1。

标签:一练,right,target,nums,--,蓝桥,数组,目标值,left
From: https://blog.csdn.net/ylccccc1/article/details/143415259

相关文章

  • 【深度学习滑坡制图|论文解读4】基于融合CNN-Transformer网络和深度迁移学习的遥感影
    【深度学习滑坡制图|论文解读4】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法【深度学习滑坡制图|论文解读4】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法文章目录【深度学习滑坡制图|论文解读4】基于融合CNN-Transformer......
  • math.h包含什么内容
    1.基本算数运算函数fabs:计算浮点数的绝对值(默认情况下是double类型的) fmod:计算两个浮点数相除的余数(跟整形中的%比较类似,默认也是double类型的)fmin:两个浮点数中取出最小值 (默认也是double类型的)fmax:两个浮点数去除最大值(默认也是double类型的) 2.幂函数与指数函数p......
  • Net 9中LINQ新增特性
    在.NET9中,LINQ引入了一些新的特性和增强功能,以下是主要的新特性列表:1.AsQueryable()扩展方法对List<T>支持在.NET9中,List<T>类型现在支持调用AsQueryable()方法,将List<T>转换为IQueryable<T>,使得可以执行更复杂的LINQ查询,尤其是在与IQueryable数据源......
  • java计算机毕业设计基于springboot的小区物业管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着城市化进程的加速,小区规模不断扩大,小区物业管理面临着诸多挑战。传统的物业管理方式依赖人工操作,效率低下,容易出现信息管理混乱、服务响应不......
  • java计算机毕业设计在线考试(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着信息技术的迅猛发展,互联网在教育领域的渗透日益加深。在线教育成为一种广泛应用的教育模式,与之相伴的在线考试也逐渐兴起。传统考试存在诸多......
  • C++20 STL CookBook 4:使用range在容器中创建view
    目录rangeviewrange_adaptor的三个概念以std::string和std::string_view为例子初次入手补充ranges的一些操作rangeviewrange_adaptor的三个概念新的范围库是C++20中更重要的新增功能之一。它为过滤和处理容器提供了新的范例。范围为更有效和可读的代码提供了简......
  • Qt Event事件系统小探1
    目录QtEventSystemFromqt.doc如何传递事件事件类型事件处理程序事件过滤器发送事件事件的产生和派发处理我们的事件来一段好玩的代码扩展:QWidget如何处理我们的事件?扩展2:实现一个变色的LabelQtEventSystemFromqt.doc在Qt中,事件是从抽象QEvent类派......
  • 【保姆级教程】使用 oh-my-posh 和 clink 打造个性化 PowerShell 和 CMD
    内容预览≧∀≦ゞ终端美化指南——oh-my-posh和clink篇引言一、准备工作默认终端:WindowsTerminal离线安装步骤包管理器:scoop为什么选择使用Scoop安装?scoop安装scoop常用命令字体下载二、配置WindowsTerminal三、配置oh-my-posh安装激活oh-my-posh编辑P......
  • 【大数据学习 | kafka】消费者的分区分配规则
    1.概述上面我们提到过,消费者有的时候会少于或者多于分区的个数,那么如果消费者少了有的消费者要消费多个分区的数据,如果消费者多了,有的消费者就可能没有分区的数据消费。那么这个关系是如何分配的呢?现在我们知道kafka中存在一个coordinator可以管理这么一堆消费者,它可以帮......
  • 【大数据学习 | kafka】简述kafka的消费者consumer
    1.消费者的结构能够在kafka中拉取数据进行消费的组件或者程序都叫做消费者。这里面要涉及到一个动作叫做拉取。首先我们要知道kafka这个消息队列主要的功能就是起到缓冲的作用,比如flume采集数据然后交给spark或者flink进行计算分析,但是flume采用的就是消息的push方式,这个......