前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试题:部分排序

面试题:部分排序

作者头像
宇宙之一粟
发布2020-10-26 10:37:00
2590
发布2020-10-26 10:37:00
举报
文章被收录于专栏:宇宙之_一粟

题目描述

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

代码语言:javascript
复制
// 
// 示例: 
// 输入: [1,2,4,7,10,11,7,12,6,7,16,18,19]
// 输出: [3,9]
// 
// 提示: 
// 
// 0 <= len(array) <= 1000000 
// 
// Related Topics 排序 数组 
// ? 25 ? 0

解决思想:

  1. 从左往右扫,寻找逆序对。(正序,逐渐变大)
  2. 用来记录最右的那个逆序对位置

原理:如果左侧最大值大于中间的最小值,则一定会被中间序列包括;同理,如果右侧最小值大于中间的最大值,则一定会被中间序列包括。

一遍遍历 + 两个指针(两次扫描可一次遍历完成)

1、从前向后扫描数组,判断当前array[i]是否比max小,是则将last置为当前array下标i,否则更新max;

2、从后向前扫描数组,判断当前array[len - 1 - i]是否比min大,是则将first置位当前下标len - 1 - i,否则更新min;

代码语言:javascript
复制
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};
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档