最小调整有序解题

题目:最小调整有序

题目描述:给定一个int整数数组A及其大小n,请编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的。注意:n-m应该越小越好,即找出符合条件的最短序列。 请返回一个二元组,元组的两个元素分别代表所求序列的起点和终点。(原序列位置从0开始标号,若原序列有序,返回[0,0])。要求A中元素均为正整数。
OJ链接:https://www.nowcoder.com/practice/091c2f1cf441484f81696f08328b06cd?tpId=8&&tqId=11059&rp=1&ru=/activity/oj&qru=/ta/cracking-the-coding-interview/question-ranking

解题思路:
1、找最右端序列(从左向右找):注意在中间乱序的序列中(也就是待排序的那组序列)一定存在待排序序列中的最大值,找到这个max,然后在其右边的序列中找到最后一个比max小的数字,它的下标就是最右端下标,即n。
2、找左端序列(从右向左找):思路一样,在中间乱序的序列中(也就是待排序的那组序列)一定存在待排序序列中的最小值,找到这个min, 然后在其左边的序列中找到最后一个比min小的数字,它的下标就是最左端下标,即m。
在这里插入图片描述
Java解题:

public class FindSegment {
    public static void main(String[] args) {
        int[] array = {1,4,7,5,2,6,8,9,10};
        int[] segmentRange = findSegment(array,array.length);
        System.out.println("n="+segmentRange[0]);
        System.out.println("m="+segmentRange[1]);
    }

    public static int[] findSegment(int[] A,int n){
        if (A.length == 0){
            return new int[]{0,0};
        }
        int[] segmentRange = new int[2];
        int right = 0;
        int left = 0;
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        for (int i = 0; i < n; i++) {
            if (A[i] >= max){
                max = A[i];
            }
            else {
                right = i;  //最右边的下标
            }
        }
        for (int j = n-1; j >= 0; j--) {
            if (A[j] <= min){
                min = A[j];
            }
            else{
                left = j;   //最左边的下标
            }
        }
        segmentRange[0] = left;
        segmentRange[1] = right;
        return segmentRange;
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值