【每日算法Day 88】超越妹妹教你如何做这道排序题
题目链接
LeetCode 面试题 16.16. 部分排序[1]
题目描述
给定一个整数数组,编写一个函数,找出索引 m
和 n
,只要将索引区间 [m, n]
的元素排好序,整个数组就是有序的。注意:n-m
尽量最小,也就是说,找出符合条件的最短序列。函数返回值为 [m, n]
,若不存在这样的 m
和 n
(例如整个数组是有序的),请返回 [-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】超越妹妹教你如何做这道排序题相关推荐
- 整数反转leetcode java_【Java】【每日算法/刷穿 LeetCode】7. 整数反转(简单)
首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]7. 整数反转(简单) 宫水三叶发布于 今天 12:10 题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数 ...
- 【每日算法】C语言8大经典排序算法(2)
接上文--->[每日算法]C语言8大经典排序算法(1) 二.插入类排序 插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中 ...
- java回文数算法for_【Java】【每日算法/刷穿 LeetCode】9. 回文数(简单)
首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]9. 回文数(简单) 宫水三叶发布于 今天 15:30 题目描述 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从 ...
- 如何判断数组所有数都不等于一个数_【每日算法Day 91】求解数组中出现次数超过1/3的那个数
题目链接 LeetCode 229. 求众数 II[1] 题目描述 给定一个大小为 的数组,找出其中所有出现超过 次的元素. 说明: 要求算法的时间复杂度为 ,空间复杂度为 . 示例1 输入: [3, ...
- 每日算法C语言1-求某整数
每日算法C语言 题目 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 程序分析: 在10万以内判断,先将该数加上100后再开方,再将该数加上168后再开方如 ...
- 消除左递归c++代码_【每日算法Day 85】图解算法:一行代码解决约瑟夫环的变体...
题目链接 LeetCode 390. 消除游戏[1] 题目描述 给定一个从 到 排序的整数列表. 首先,从左到右,从第一个数字开始,每隔一个数字进行删除,直到列表的末尾. 第二步,在剩下的数字中,从右 ...
- 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符
题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...
- python 旋转矩阵_【每日算法Day 93】不用额外空间,你会旋转一个矩阵吗?
第 100 天时,我可能会对这 100 天以来的算法题进行一个总结,然后暂时停止更新 LeetCode 题解了. 下一步可能更新 NLP 相关算法了,非常感谢大家每天的支持. 题目链接 LeetCod ...
- 每日算法刷题Day7-比较字符串大小,去掉多余的空格,单词替换
⭐每日算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,与笔者另一系列文章有所区别,并不是以知识点的形式提升算法能力,而是以实战习题的形式理解算法,使用算法.
- 每日算法(四十三)-java为了更改的规划城市,需要统计楼栋数目信息。
每日算法(四十三)-java为了更改的规划城市,需要统计楼栋数目信息. 为了更改的规划城市,需要统计楼栋数目信息. 方法如下,一张航拍照片会被分隔为N*M个小格子,每个格子可以用0跟1来表示.如果楼栋 ...
最新文章
- 粒子滤波在图像跟踪领域的实践
- bcp 导入导出大全
- 自己动手写第一阶段的处理器(1)——计算机的简单模型、架构、指令系统
- WEB服务在单点登录系统中的应用研究
- C语言实现文件读取矩阵乘法
- python程序员工作时间_Python程序员是怎么找工作的?怎么最快时间找到自己想要的工作?...
- Python函数式编程简介(二)返回函数
- 学习excel数据分析_为什么Excel是学习数据分析的最佳方法
- 在大厂工作5年的大神,给前端初学者的四大建议,收藏咯
- kafka的延迟操作-pull操作详解
- paip.提升用户体验---c++ 右键菜单以及socket接口
- 《高等数学》练习题库含答案(大学期末复习资料)
- Java家庭收支记账程序
- MT1308芯片原厂
- 利用大数据 勾画虚开企业脸谱
- 【疲劳检测】基于形态学实现疲劳检测附matlab代码
- 电子工程师入门宝典:最常用十大电子元器件-电子技术方案|电路图讲解
- [事件处理] js实现的文本框内容发生改变立马触发事件简单介绍
- {}企业如何利用邮件进行推广?
- 微信发出去的照片服务器会保存吗,转发或保存别人微信朋友圈的照片,别人是否会知道...