Java 如何在随机交换2个元素的情况下快速恢复不断增加的阵列?
如果我有一个数组Java 如何在随机交换2个元素的情况下快速恢复不断增加的阵列?,java,algorithm,Java,Algorithm,如果我有一个数组A=[1,2,3,4,5,6,7],A是一个递增数组,没有重复的元素。如果我交换两个元素,比如说4和7。我得到数组B=[1,2,3,7,5,6,4] 给定数组B,恢复A的快速方法是什么 目前,最简单的方法是使用Collections排序方法对数组进行排序并进行比较,以获得两个不同的索引,这需要O(n)空间和O(n)时间 为了澄清问题,这里为您提供了输入B,您应该输出B只需从左侧和右侧开始搜索交换的元素,并在找到时交换它们 // Let' assume the array is s
A=[1,2,3,4,5,6,7]
,A
是一个递增数组,没有重复的元素。如果我交换两个元素,比如说4
和7
。我得到数组B=[1,2,3,7,5,6,4]
给定数组B
,恢复A
的快速方法是什么
目前,最简单的方法是使用Collections排序方法对数组进行排序并进行比较,以获得两个不同的索引,这需要O(n)
空间和O(n)
时间
为了澄清问题,这里为您提供了输入
B
,您应该输出B
只需从左侧和右侧开始搜索交换的元素,并在找到时交换它们
// Let' assume the array is stored in a variable 'arr'
private void restoreArray() {
swap(getLeftSwapIndex(), getRightSwapIndex());
}
private void swap(int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
private void getLeftSwapIndex() {
for (int i=0 ; i<arr.length-1 ; i++) {
if (arr[i] > arr[i+1]) return i;
}
return 0; // does not happen
}
private void getRightSwapIndex() {
for (int i=arr.length-1 ; i>0 ; i--) {
if (arr[i] < arr[i-1]) return i;
}
return 0; // does not happen
}
//假设数组存储在变量“arr”中
私人空间{
交换(getLeftSwapIndex(),getRightSwapIndex());
}
私有无效交换(int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=温度;
}
私有void getLeftSwapIndex(){
对于(int i=0;i arr[i+1])返回i;
}
返回0;//不会发生
}
私有void getRightSwapIndex(){
对于(int i=arr.length-1;i>0;i--){
如果(arr[i]
在我看来,这并不是什么聪明的方法,除了在O(n)中迭代之外。你想出了什么方法,为什么你认为这可以做得更快?随机交换?返回的最快方法是O(nlogn)-合并排序。O(n)如果只是一次交换……那么你得到的是B是一个排序数组,除了一次随机元素的交换?@cricket_007:m认为Idos会不同意(我也不同意)。是不是getLeftSwapIndex()==getRightSwapIndex()-1
?在[1,2,6,4,5,3,7,8]中,你会得到2和5作为左右索引。