【编程题】最小调整有序(Java实现)
题目来源
题目描述
有一个整数数组,请编写一个函数,找出索引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;
}
}