面试题:部分排序
时间:2022-07-28
本文章向大家介绍面试题:部分排序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目描述
给定一个整数数组,编写一个函数,找出索引m和n,只要将索引区间[m,n]的元素排好序,整个数组就是有序的。注意:n-m尽量最小,也就是说,找出符合条件的最短序列。函数返回值为[m,n],若不存在这样的m和n(例如整个数组是有序的),请返回[-1,-1]。
//
// 示例:
// 输入: [1,2,4,7,10,11,7,12,6,7,16,18,19]
// 输出: [3,9]
//
// 提示:
//
// 0 <= len(array) <= 1000000
//
// Related Topics 排序 数组
// ? 25 ? 0
解决思想:
- 从左往右扫,寻找逆序对。(正序,逐渐变大)
- 用来记录最右的那个逆序对位置
原理:如果左侧最大值大于中间的最小值,则一定会被中间序列包括;同理,如果右侧最小值大于中间的最大值,则一定会被中间序列包括。
一遍遍历 + 两个指针(两次扫描可一次遍历完成)
1、从前向后扫描数组,判断当前array[i]是否比max小,是则将last置为当前array下标i,否则更新max;
2、从后向前扫描数组,判断当前array[len - 1 - i]是否比min大,是则将first置位当前下标len - 1 - i,否则更新min;
class Solution {
public int[] subSort(int[] array) {
if (array == null || array.length == 0) return new int[] {-1, -1};
int max = array[0];
int r = -1;
for (int i = 1; i < array.length; i++) {
int v = array[i];
if (v >= max) {
max = v;
} else {
r = i;
}
}
if (r == -1) return new int[] {-1, -1};
int min = array[array.length - 1];
int l = -1;
for (int i = array.length - 2; i >= 0; i--) {
int v = array[i];
if (v <= min) {
min = v;
} else {
l = i;
}
}
return new int[] {l, r};
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法