算法练习帖--20--数组部分排序(Java)

数组部分排序(Java)

一、 题目描述:

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

示例:
输入: [1,2,4,7,10,11,7,12,6,7,16,18,19]
输出: [3,9]
提示:
0 <= len(array) <= 1000000
二、解决方法

1. 双指针法

public static int[] subSort(int[] array) {
        int length=array.length;
        if(array==null||array.length<=1){
            return new int[]{-1,-1};
        }
        //第一个指针
        int first=-1;
        //第二个指针
        int last=-1;
        //从左往右寻找最大值
        int max=Integer.MIN_VALUE;
        //从右往左寻找最小值
        int min=Integer.MAX_VALUE;
        for (int i = 0; i < length; i++) {
            //从左看,如果一直升序则不需要排序
            //当有值小于左侧序列最大值的时候,说明这个数必须纳入到需要排序的范围
            if(array[i]<max){
                last=i;
            }else{
                max=Math.max(max,array[i]);
            }
            //从右看,如果一直降序则不需要排序
            //当有值大于最小值的时候,说明这个数必须纳入到需要排序的范围
            if(array[length-i-1]>min){
                first=length-i-1;
            }else{
                min=Math.min(min,array[length-i-1]);
            }
        }
        //循环完找到两个下标first,last
        //没找到的话,说明整个序列都是有序的
        return new int[]{first,last};
    }

2. 整体排序+比较

		//记录两个数组不同区间的下标
        int first=-1;
        int last=-1;
        //是否找到第一个下标的标志
        boolean fFlag=false;
        //是否找到第二个下标的标志
        boolean lFlag=false;
        for (int i = 0; i < length; i++) {
            if(!fFlag&&array[i]!=sortArray[i]){
                first=i;
                fFlag=true;
            }
            if(!lFlag&&array[length-i-1]!=sortArray[length-i-1]){
                last=length-i-1;
                lFlag=true;
            }
        }

3. 更多解法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值