【编程题】最小调整有序(Java实现)

【编程题】最小调整有序(Java实现)

题目来源

程序员面试经典
https://www.nowcoder.com/practice/091c2f1cf441484f81696f08328b06cd?tpId=8&tqId=11059&tPage=4&rp=4&ru=/ta/cracking-the-coding-interview&qru=/ta/cracking-the-coding-interview/question-ranking

题目描述

有一个整数数组,请编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的。注意:n-m应该越小越好,也就是说,找出符合条件的最短序列。
给定一个int数组A和数组的大小n,请返回一个二元组,代表所求序列的起点和终点。(原序列位置从0开始标号,若原序列有序,返回[0,0])。保证A中元素均为正整数。
测试样例:
[1,4,6,5,9,10],6
返回:[2,3]

解答

方法一 排序比较
思路
将数组进行排序,从前往后比较第一个不同的为m,从后往前进行比较,第二个不同的为n
例如,原数组: 【3,1,4,5,6】
排序后数组:【1,3,4,5,6】
从前往后第一个不一样为m=0位置
从后往前第一个不一样为n=1位置
代码

import java.util.*;
public class Rearrange {
    public int[] findSegment(int[] A, int n) {
        // write code here
        int[] arr=new int[2];
        if(A==null||A.length<=0||n<=0)return arr;
        int[] B=new int[n];
        for(int i=0;i<n;i++){
            B[i]=A[i];
        }
        Arrays.sort(A);
        int i=0;
       while(A[i]==B[i]){
           if(i==n-1)return arr;
           else i++;
       }
      
       int j=n-1;
       while(A[j]==B[j]){
           if(j==0)return arr;
           else
               j--;
       }
         arr[0]=i;
         arr[1]=j;
        return arr;
    }
}

方法二 直接遍历
思路
进行两次遍历,一次从左到右找出n,一次从右到左找出m
(1)从左到右找出n
如果当前元素小于之前的最大元素则说明当前元素应处于[m n]无序序列中而且当前元素是当前最大下标的无序元素所以更新n为当前元素下标。
(2)从右到左找出m
如果当前元素大于之前的最小元素则说明当前元素应处于[m n]无序序列中而且当前元素是当前最小下标的无序元素所以更新m为当前元素下标。
例如:
数组【3,4,5,7,6,1,6,8,9,10】
从前往后:
①4>3更新最大值为4,下标为1
②5>4更新最大值为5,下标为2
③7>5更新最大值为7,下标为3
④6<7设置n为4,下标为4
⑤1<7设置n为5,下标为5
⑥6<7设置n为6,下标为6
⑦8>7,更新最大值为8,下标为7
⑧9>8,更新最大值为9,下标为8
⑨10>9,更新最大值为10,下标为⑨
完成遍历
n=6,
从后往前也一样
代码

import java.util.*;
public class Rearrange {
    public int[] findSegment(int[] A, int n) {
        // write code here
        int[] arr=new int[2];
        if(A==null||A.length<=0||n<=0)return arr;
        int max=A[0],min=A[n-1];
        for(int i=1;i<n;i++){
            if(A[i]>=max)
                max=A[i];
            else
                arr[1]=i;
        }
        for(int i=n-1;i>=0;i--){
            if(A[i]<=min)
                min=A[i];
            else
                arr[0]=i;
        }
        return arr;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值