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

算法随笔_12:最短无序子数组

上一篇: 算法随笔_11: 字符串的排列-CSDN博客

题目描述如下:

给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。请你找出符合题意的最短子数组,并输出它的长度。

示例 1:

输入:nums = [2,6,4,8,10,9,15]

输出:5

解释:你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。

===================

我们一起来分析一下这道题。

需要找出的这个子数组可以是任意的位置。不失一般性的,我们可以假设这个子数组的起始点在原来数组的中间某处。我们假设这个子数组为nums_mid,那么此时它分割出来左右两个子数组分别为nums_left,nums_right。按照题意,如果对子数组nums_mid进行升序排序,整个数组都会变为升序排序,那么原数组应该有以下的特征:

仅对子数组nums_mid进行升序排序,就相当于对全数组进行了排序。反过来说,对全数组进行排序,其实只是把nums_mid进行了排序。在排序的前后,nums_left,nums_right两个子数组的序列是不变的。

基于此特征,我们可以写出如下算法:

我们对原数组进行升序排序。排序之后,我们把排序之后的数组与原数组从左到右逐个字符的进行比较。当发现第一个出现不同的字符时,我们就找到了nums_left。同理,从右至左逐个字符的进行比较,我们就找到nums_right。那么,中间的这一块儿就是nums_mid。其长度即可算出。

此算法的时间复杂度为O(nlogn) 。

==================

让我们再考虑一下有没有更优的算法?

让我们重新审视一下原题的描述。nums_mid不论是否排序,它里面的任何一个元素都比nums_left中的任何一个元素大。nums_right在排序前后本身就不改变序列,因此,它的任何一个元素也比nums_left的任何一个元素大。因此,nums_left有如下特征:

1. 它是一个升序排列。

2. 它的最大值一定比后面所有数的最小值还要小。

基于此特征,我们可以给出如下的算法:

1. 我们设置两个变量,nums_left_max(表示nums_left的最大值的下标),和left_min(表示nums_left后面所有数的最小值)。

2. 我们从右向左遍历原数组,记录当前已经遍历过的元素的最小值left_min。并且每个当前访问的元素e和left_min比较,会有下面两种情况:

   a. 如果e小于left_min,并且nums_left_max为-1,我们记录当前下标为nums_left_max。

   b. 如果e大于left_min,那么nums_left_max肯定不为当前的下标。我们把nums_left_max重置为1。

遍历完成后我们就找到了nums_left_max。

同理,我们可以求出nums_right_min(表示nums_right的最小值的下标)。

最终两数相减即为题目答案。由于此算法只执行了一次遍历,因此时间复杂度为O(N) 。

算法具体实现时注意一下边界条件。实际代码如下:

class Solution(object):def findUnsortedSubarray(self, nums):n=len(nums)nums_left_max=-1nums_right_min=nleft_min=float('inf')right_max=float('-inf')for i in range(n):if right_max<=nums[i]:right_max=nums[i]if nums_right_min==n:nums_right_min=ielse:nums_right_min=nif left_min>=nums[n-i-1]:left_min=nums[n-i-1]if nums_left_max==-1:nums_left_max=n-i-1else:nums_left_max=-1ret=nums_right_min-nums_left_max-1ret=0 if ret<0 else retreturn ret

相关文章:

算法随笔_12:最短无序子数组

上一篇: 算法随笔_11: 字符串的排列-CSDN博客 题目描述如下: 给你一个整数数组 nums &#xff0c;你需要找出一个 连续子数组 &#xff0c;如果对这个子数组进行升序排序&#xff0c;那么整个数组都会变为升序排序。请你找出符合题意的最短子数组&#xff0c;并输出它的长度。…...

计算机毕业设计PySpark+Hadoop+Hive机票预测 飞机票航班数据分析可视化大屏 航班预测系统 机票爬虫 飞机票推荐系统 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Linux-C/C++--初探linux应用编程概念

对于大多数首次接触 Linux 应用编程的读者来说&#xff0c;可能对应用编程&#xff08;也可称为系统编程&#xff09;这个概念并不 太了解&#xff0c;所以在正式学习 Linux 应用编程之前&#xff0c;笔者有必要向大家介绍这些简单基本的概念&#xff0c;从整体上认识 到应用编…...

用sklearn运行分类模型,选择AUC最高的模型保存模型权重并绘制AUCROC曲线(以逻辑回归、随机森林、梯度提升、MLP为例)

诸神缄默不语-个人CSDN博文目录 文章目录 1. 导入包2. 初始化分类模型3. 训练、测试模型&#xff0c;绘图&#xff0c;保存指标 1. 导入包 from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier, GradientBoostingClass…...

动手学大数据-3社区开源实践

目录 数据库概览&#xff1a; MaxComput&#xff1a; HAWQ&#xff1a; Hologres&#xff1a; TiDB&#xff1a; Spark&#xff1a; ClickHouse&#xff1a; Apache Calcite 概览 Calcite RBO HepPlanner 优化规则&#xff08;Rule&#xff09; 内置有100优化规则 …...

使用Pydantic驾驭大模型

本文介绍Pydantic 库&#xff0c;首先介绍其概念及优势&#xff0c;然后通过基本示例展示如何进行数据验证。后面通过多个示例解释如何在LangChain中通过Pydantic进行数据验证&#xff0c;保证与大模型进行交互过程中数据准确性&#xff0c;并显示清晰的数验证错误信息。 Pydan…...

【HarmonyOS之旅】基于ArkTS开发(二) -> UI开发之常见布局

目录 1 -> 自适应布局 1.1 -> 线性布局 1.1.1 -> 线性布局的排列 1.1.2 -> 自适应拉伸 1.1.3 -> 自适应缩放 1.1.4 -> 定位能力 1.1.5 -> 自适应延伸 1.2 -> 层叠布局 1.2.1 -> 对齐方式 1.2.2 -> Z序控制 1.3 -> 弹性布局 1.3.1…...

【论文投稿】Python 网络爬虫:探秘网页数据抓取的奇妙世界

目录 前言 一、Python—— 网络爬虫的绝佳拍档 二、网络爬虫基础&#xff1a;揭开神秘面纱 &#xff08;一&#xff09;工作原理&#xff1a;步步为营的数据狩猎 &#xff08;二&#xff09;分类&#xff1a;各显神通的爬虫家族 三、Python 网络爬虫核心库深度剖析 &…...

队列的基本用法

以下是关于 C 语言中队列的详细知识&#xff0c;包括队列的生成、相关函数使用以及其他重要概念&#xff1a; 一、队列的概念 队列是一种线性数据结构&#xff0c;它遵循先进先出&#xff08;First In First Out&#xff0c;FIFO&#xff09;的原则&#xff0c;就像日常生活中…...

网络安全VS数据安全

关于网络安全和数据安全&#xff0c;我们常听到如下两种不同声音&#xff1a; 观点一&#xff1a;网络安全是数据安全的基础&#xff0c;把当年做网络安全的那一套用数据安全再做一遍。 观点二&#xff1a;数据安全如今普遍以为是网络安全的延伸&#xff0c;实际情况是忽略数据…...

Linux(NFS服务)

赛题拓扑&#xff1a; 题目&#xff1a; NFS&#xff1a; 共享/webdata/目录。用于存储AppSrv主机的WEB数据。仅允许AppSrv主机访问该共享。 [rootstoragesrv ~]# yum install nfs-utils -y [rootstoragesrv ~]# mkdir /webdata [rootstoragesrv ~]# chmod -R ow /webdata …...

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)边缘检测

OpenCV中边缘检测四种常用算子&#xff1a; &#xff08;1&#xff09;Sobel算子 Sobel算子是一种基于梯度的边缘检测算法。它通过对图像进行卷积操作来计算图像的梯度&#xff0c;并将梯度的大小作为边缘的强度。它使用两个3x3的卷积核&#xff0c;分别用于计…...

SSM课设-学生管理系统

【课设者】SSM课设-学生管理系统 技术栈: 后端: SpringSpringMVCMybatisMySQLJSP 前端: HtmlCssJavaScriptEasyUIAjax 功能: 学生端: 登陆 学生信息管理 个人信息管理 老师端: 多了教师信息管理 管理员端: 多了班级信息管理 多了年级信息管理 多了系统用户管理...

【Pytorch实用教程】TCN(Temporal Convolutional Network,时序卷积网络)简介

文章目录 TCN的基本特点TCN的优点TCN的应用场景典型的TCN架构总结TCN(Temporal Convolutional Network,时序卷积网络)是一种用于处理序列数据的深度学习模型,尤其适用于时间序列预测、语音识别、自然语言处理等任务。它利用卷积神经网络(CNN)来处理时序数据,相比于传统的…...

网络安全 | 什么是正向代理和反向代理?

关注&#xff1a;CodingTechWork 引言 在现代网络架构中&#xff0c;代理服务器扮演着重要的角色。它们在客户端和服务器之间充当中介&#xff0c;帮助管理、保护和优化数据流。根据代理的工作方向和用途&#xff0c;代理服务器可分为正向代理和反向代理。本文将深入探讨这两种…...

3 前端(中):JavaScript

文章目录 前言&#xff1a;JavaScript简介一、ECMAscript&#xff08;JavaScript基本语法&#xff09;1 JavaScript与html结合方式&#xff08;快速入门&#xff09;2 基本知识&#xff08;1&#xff09;JavaScript注释&#xff08;和Java注释一样&#xff09;&#xff08;2&am…...

VIT论文阅读与理解

transform网络结构 vision transform网络结构 图1&#xff1a;模型概述。我们将图像分割成固定大小的补丁&#xff0c;线性嵌入每个补丁&#xff0c;添加位置嵌入&#xff0c;并将结果向量序列馈送到标准Transformer编码器。为了执行分类&#xff0c;我们使用标准方法向序列中添…...

JavaScript笔记APIs篇01——DOM获取与属性操作

黑马程序员视频地址&#xff1a;黑马程序员前端JavaScript入门到精通全套视频教程https://www.bilibili.com/video/BV1Y84y1L7Nn?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p78https://www.bilibili.com/video/BV1Y84y1L7Nn?…...

SQL表间关联查询详解

简介 本文主要讲解SQL语句中常用的表间关联查询方式&#xff0c;包括&#xff1a;左连接&#xff08;left join&#xff09;、右连接&#xff08;right join&#xff09;、全连接&#xff08;full join&#xff09;、内连接&#xff08;inner join&#xff09;、交叉连接&…...

select函数

系统调用 select()可用于执行 I/O 多路复用操作&#xff0c;调用 select()会一直阻塞&#xff0c;直到某一个或多个文件描述符成为就绪态&#xff08;可以读或写&#xff09;。其函数原型如下所示&#xff1a; #include <sys/select.h> int select(int nfds, fd_set *re…...

996引擎 - [开发辅助] 利用 robocopy 同步项目 dev 文件夹

996引擎 - [开发辅助] 利用 robocopy 同步项目 dev 文件夹 代码 git 管,资源统一放内网服务器。 使用以下脚本同步 岗位 同步方向 需求 策划 本地 >>> 内网服务器 提交资源 美术 本地 >>> 内网服务器 提交资源 程序 内网服务器 >>> 本地 拉取资源 …...

收藏!后端转大模型开发1年,从CRUD麻木到眼里有光,小白也能参考的转行实录

做后端开发整整五年&#xff0c;说句实在话&#xff0c;日常工作几乎离不开CRUD的循环——增删改查反复敲&#xff0c;偶尔优化下接口响应速度、排查线上突发的bug&#xff0c;日子过得像精准运转的发条钟&#xff0c;安稳是真安稳&#xff0c;但越往后走&#xff0c;心里的恐慌…...

SteamTinkerLaunch Winetricks集成:dotnet48等依赖库的自动安装方法

SteamTinkerLaunch Winetricks集成&#xff1a;dotnet48等依赖库的自动安装方法 【免费下载链接】steamtinkerlaunch Linux wrapper tool for use with the Steam client for custom launch options and 3rd party programs 项目地址: https://gitcode.com/gh_mirrors/st/ste…...

TP4552B低功耗 5V 常开的锂电池充放电解决方案

概述 TP4552B 是一款集成线性充电管理、同步升压转换、电池电量指示和多种保护功能的单芯片电源管理 SOC&#xff0c;为锂电池的充放电提供完整的单芯片电源解决方案。 TP4552B 内部集成了线性充电管理模块、同步升压放电管理模块、电量检测与 LED 指示模块、保护模块。TP4552B…...

10分钟快速上手:一站式AI变声神器RVC全平台部署终极指南

10分钟快速上手&#xff1a;一站式AI变声神器RVC全平台部署终极指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Conve…...

[RKNN] 零拷贝接口:从原理到实践的性能优化指南

1. 为什么需要零拷贝接口 第一次接触RKNN零拷贝接口时&#xff0c;我正为一个智能摄像头项目焦头烂额。当时用通用接口跑YOLOv5模型&#xff0c;帧率始终卡在15FPS上不去。直到把代码改成零拷贝版本&#xff0c;帧率直接飙到28FPS——这个性能提升让我彻底理解了零拷贝的价值。…...

Ryzen处理器终极调优指南:3步解锁AMD CPU隐藏性能

Ryzen处理器终极调优指南&#xff1a;3步解锁AMD CPU隐藏性能 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcod…...

3步搞定专业排版:《经济研究》LaTeX模板完整指南

3步搞定专业排版&#xff1a;《经济研究》LaTeX模板完整指南 【免费下载链接】Chinese-ERJ 《经济研究》杂志 LaTeX 论文模板 - LaTeX Template for Economic Research Journal 项目地址: https://gitcode.com/gh_mirrors/ch/Chinese-ERJ 你是否曾经为了论文格式调整而熬…...

CHORD-X多风格研报生成效果展:对比券商风、学术风与自媒体风格

CHORD-X多风格研报生成效果展&#xff1a;对比券商风、学术风与自媒体风格 最近在试用各种AI写作工具&#xff0c;发现一个挺有意思的现象&#xff1a;很多模型写出来的东西&#xff0c;风格都差不多&#xff0c;要么是那种很官方的口吻&#xff0c;要么就是一股AI味儿。直到我…...

Jupyter Notebook配置避坑指南:为什么改了路径还是报错?

Jupyter Notebook路径配置终极排障手册&#xff1a;从原理到实战 第一次打开Jupyter Notebook时&#xff0c;那个熟悉的C盘用户目录是否让你感到束手束脚&#xff1f;许多开发者都遇到过这样的困境&#xff1a;明明按照教程修改了配置文件&#xff0c;重启后却依然报错或路径未…...