Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在随机交换2个元素的情况下快速恢复不断增加的阵列?_Java_Algorithm - Fatal编程技术网

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作为左右索引。