对于一个无序数组A,请设计一个算法,求出需要排序的最短子数组的长度。
给定一个整数数组A及它的大小n,请返回最短子数组的长度。
测试样例:
[1,5,3,4,2,6,7],7
返回:4
算法思路:
另外拷贝一份原数组给 B B B 数组,对 B B B 数组排序,两个指针 i i i , j j j 分别从 A A A 数组两头开始移动,直至 B [ i ] ! = A [ i ] B[i]!=A[i] B[i]!=A[i] 或者 B [ j ] ! = A [ j ] B[j]!=A[j] B[j]!=A[j] ,最后返回 j − i + 1 j-i+1 j−i+1 。
import java.util.*;
public class ShortSubsequence {
public static void quickSort_3(int[] arr,int L,int R) {
if(L>=R)return;
//随机划分值
Random random=new Random();
int randomIndex=L+random.nextInt(R-L+1);
swap(arr,randomIndex,R);
int[] Border=new int[2];
Border=doutchFlag_2(arr,arr[R],L,R-1);
swap(arr,Border[1]+1,R);
quickSort_3(arr,L,Border[0]-1);
quickSort_3(arr,Border[1]+2,R);
}
//返回小于区和大于区边界
public static int[] doutchFlag_2(int[] arr,int k,int L,int R) {//荷兰国旗问题2
int smallBorder=L-1;//小于区边界
int bigBorder=R+1;//大于区边界
int cur=L;//当前位置
while(cur<bigBorder) {
if(arr[cur]==k)cur++;
else if(arr[cur]<k) {
swap(arr,cur++,++smallBorder);
}
else {
swap(arr,cur,--bigBorder);
}
}
int[] equalBorder=new int[]{smallBorder+1,bigBorder-1};
return equalBorder;
}
public static void swap(int[] arr,int a,int b) {
if(a==b)return;
int tmp=arr[a];
arr[a]=arr[b];
arr[b]=tmp;
}
public int findShortest(int[] A, int n) {
// write code here
int[] tmp=new int[A.length];
for(int i=0;i<A.length;++i) {
tmp[i]=A[i];
}
quickSort_3(A,0,A.length-1);
int L=0,R=A.length-1;
while(L<A.length&&A[L]==tmp[L])L++;
while(R>=0&&A[R]==tmp[R])R--;
if(L>R)return 0;
return R-L+1;
}
}