每日一图:我老婆可爱不?

题目链接

LeetCode 面试题 16.16. 部分排序[1]

题目描述

给定一个整数数组,编写一个函数,找出索引 mn,只要将索引区间 [m, n] 的元素排好序,整个数组就是有序的。注意:n-m 尽量最小,也就是说,找出符合条件的最短序列。函数返回值为 [m, n],若不存在这样的 mn(例如整个数组是有序的),请返回 [-1, -1]

示例1

        输入:
[1,2,4,7,10,11,7,12,6,7,16,18,19]
输出:
[3,9]

说明:

  • 0 <= len(array) <= 1000000

题解

首先虽然题目没说,但是实际运行下来数列是单调递增的,所以我们下面默认数列是递增的。

那么对于元素 a[i] 来说,如果它左边存在大于 a[i] 的元素,那么 a[i] 是一定要参与到排序里去的。或者说如果它右边存在小于 a[i] 的元素,那么 a[i] 也是要参与到排序里去的。

所以我们只需要寻找最靠右的那个数(满足左边存在大于它的数),和最靠左的那个数(满足右边存在小于它的数),那么这两个数之间就是要排序的区间了。

为什么最靠右的那个(满足左边存在大于它的数)数一定能保证右边没有更小的数了呢?因为如果右边还有更小的数,那么那个更小的数才是更靠右的啊,这就矛盾了。

所以我们只需要从左到右扫描一遍,用一个变量维护一下最大值就行了,然后反向再遍历一遍,维护一个最小值。

代码

c++

        class Solution {public:vector<int> subSort(vector<int>& array) {int n = array.size();int maxx = INT_MIN, minn = INT_MAX;int l = -1, r = -1;for (int i = 0; i < n; ++i) {if (array[i] < maxx) r = i;else maxx = array[i];}for (int i = n-1; i >= 0; --i) {if (array[i] > minn) l = i;else minn = array[i];}return {l, r};}
};

python

        class Solution:def subSort(self, array: List[int]) -> List[int]:n = len(array)maxx, minn = -10000000, 10000000l, r = -1, -1for i in range(n):if array[i] < maxx: r = ielse: maxx = array[i]for i in range(n-1, -1, -1):if array[i] > minn: l = ielse: minn = array[i]return [l, r]

关注【算法码上来】,每日算法干货马上就来!

参考资料

[1]

LeetCode 面试题 16.16. 部分排序: https://leetcode-cn.com/problems/sub-sort-lcci/

【每日算法Day 88】超越妹妹教你如何做这道排序题相关推荐

  1. 整数反转leetcode java_【Java】【每日算法/刷穿 LeetCode】7. 整数反转(简单)

    首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]7. 整数反转(简单) 宫水三叶发布于 今天 12:10 题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数 ...

  2. 【每日算法】C语言8大经典排序算法(2)

    接上文--->[每日算法]C语言8大经典排序算法(1) 二.插入类排序 插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中 ...

  3. java回文数算法for_【Java】【每日算法/刷穿 LeetCode】9. 回文数(简单)

    首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]9. 回文数(简单) 宫水三叶发布于 今天 15:30 题目描述 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从 ...

  4. 如何判断数组所有数都不等于一个数_【每日算法Day 91】求解数组中出现次数超过1/3的那个数

    题目链接 LeetCode 229. 求众数 II[1] 题目描述 给定一个大小为 的数组,找出其中所有出现超过 次的元素. 说明: 要求算法的时间复杂度为 ,空间复杂度为 . 示例1 输入: [3, ...

  5. 每日算法C语言1-求某整数

    每日算法C语言 题目 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 程序分析: 在10万以内判断,先将该数加上100后再开方,再将该数加上168后再开方如 ...

  6. 消除左递归c++代码_【每日算法Day 85】图解算法:一行代码解决约瑟夫环的变体...

    题目链接 LeetCode 390. 消除游戏[1] 题目描述 给定一个从 到 排序的整数列表. 首先,从左到右,从第一个数字开始,每隔一个数字进行删除,直到列表的末尾. 第二步,在剩下的数字中,从右 ...

  7. 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符

    题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...

  8. python 旋转矩阵_【每日算法Day 93】不用额外空间,你会旋转一个矩阵吗?

    第 100 天时,我可能会对这 100 天以来的算法题进行一个总结,然后暂时停止更新 LeetCode 题解了. 下一步可能更新 NLP 相关算法了,非常感谢大家每天的支持. 题目链接 LeetCod ...

  9. 每日算法刷题Day7-比较字符串大小,去掉多余的空格,单词替换

    ⭐每日算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,与笔者另一系列文章有所区别,并不是以知识点的形式提升算法能力,而是以实战习题的形式理解算法,使用算法.

  10. 每日算法(四十三)-java为了更改的规划城市,需要统计楼栋数目信息。

    每日算法(四十三)-java为了更改的规划城市,需要统计楼栋数目信息. 为了更改的规划城市,需要统计楼栋数目信息. 方法如下,一张航拍照片会被分隔为N*M个小格子,每个格子可以用0跟1来表示.如果楼栋 ...

最新文章

  1. 粒子滤波在图像跟踪领域的实践
  2. bcp 导入导出大全
  3. 自己动手写第一阶段的处理器(1)——计算机的简单模型、架构、指令系统
  4. WEB服务在单点登录系统中的应用研究
  5. C语言实现文件读取矩阵乘法
  6. python程序员工作时间_Python程序员是怎么找工作的?怎么最快时间找到自己想要的工作?...
  7. Python函数式编程简介(二)返回函数
  8. 学习excel数据分析_为什么Excel是学习数据分析的最佳方法
  9. 在大厂工作5年的大神,给前端初学者的四大建议,收藏咯
  10. kafka的延迟操作-pull操作详解
  11. paip.提升用户体验---c++ 右键菜单以及socket接口
  12. 《高等数学》练习题库含答案(大学期末复习资料)
  13. Java家庭收支记账程序
  14. MT1308芯片原厂
  15. 利用大数据 勾画虚开企业脸谱
  16. 【疲劳检测】基于形态学实现疲劳检测附matlab代码
  17. 电子工程师入门宝典:最常用十大电子元器件-电子技术方案|电路图讲解
  18. [事件处理] js实现的文本框内容发生改变立马触发事件简单介绍
  19. {}企业如何利用邮件进行推广?
  20. 微信发出去的照片服务器会保存吗,转发或保存别人微信朋友圈的照片,别人是否会知道...

热门文章

  1. 【转载】SQL Server 2005关于数据类型最大值(3)
  2. HDU 6162 树链剖分
  3. wamp3.1.0下载地址
  4. String.format(%03d, i)在数字前面补零
  5. spark sql 的性能调优
  6. 新浪的wap网站,发现原来我们的head存在着这样的差异
  7. BroadcastReceiver 用于接收广播
  8. 分享,用sql快速创建MODEL,快速提高工作效率哦
  9. js调用后台,后台调用前台等方法总结
  10. 【系统结构】C++项目目录组织结构