最短子数组
来源:互联网 发布:linux ioremap 编辑:程序博客网 时间:2024/06/01 20:55
题目:
对于一个数组,请设计一个高效算法计算需要排序的最短子数组的长度。
给定一个int数组A和数组的大小n,请返回一个二元组,代表所求序列的长度。(原序列位置从0开始标号,若原序列有序,返回0)。保证A中元素均为正整数。
测试样例:
[1,4,6,5,9,10],6
返回:2
1.给定一个无序数组,求出需要排序的最短子数组的长度。
例如:arr={1,5,3,4,2,6,7}返回4,因为只有[5,3,4,2]需要排序
思路:时间复杂度为O(N)、额外空间复杂度为O(1)完成。
从左到右遍历,max记录遍历过的最大值,关注max>当前值的情况(max>a[k])说明k至少要移动到max位置或者更右的位置。记录下发生上述情况最右的位置即可,比如{1,5,3,4,2,6,7},最右位置应该是max=5时出现的IndexRight=4(值为2时);{1,5,3,4,2,6,5,7}应该是max=6时出现的right=6(值为5).
从右向左遍历,min记录遍历过的最小值,关注min<当前值的情况(min<a[k])说明k至少要移动到min位置或者更左的位置。记录下发生上述情况最左的位置即可,比如{1,5,3,4,2,6,7},最右位置应该是min=5时出现的IndexLeft=2(值为5时);
接下来从左向右遍历,遍历的过程记录左侧出现过的数的最大值。记为max。假设当前数为arr[i],如果arr[i]
public class Subsequence { public int shortestSubsequence(int[] a, int n) { // write code here int max=a[0]; int min=a[n-1]; int left=0; int right=n-1; for(int k=1;k<n;k++){ if(max>a[k]){//从左向右开始遍历 left=k; }else{ max=a[k]; } if(min<a[n-k-1]){//从右向左开始遍历 right=n-k-1; }else{ min=a[n-k-1]; } } if(left-right>0) return left-right+1; else return 0; }}
阅读全文
0 0
- 最短子数组
- 最短子数组
- 最短子数组
- 最短子数组
- 最短子数组
- 最短子数组
- 牛客网 | 最短子数组练习题
- 最短子数组练习题
- 牛客网 | 最短子数组练习题
- 最短子数组练习题
- 排序16:最短子数组
- 最短子数组 python
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- centos安装pip
- 24天学会设计模式------策略模式
- tomcat启动报错Could not publish to the server. java.lang.NullPointerException
- 1292: 韩信点兵
- nginx负载均衡、动静分离
- 最短子数组
- SQL Server 执行sql报错'sys.sp_OACreate' 的访问
- node之 promise
- java中:包、类、字段、方法命名规则
- 百度地图与echarts结合
- Androidstudio 2.2.3升级到2.3 后出现Refreshing gradle project问题
- oracle安装过程中远程桌面断开连接
- 微信小程序里面let,var,const的了解
- 三.Python爬虫Xpath语法与lxml库的用法