题目描述
给定一个数组arr和一个数num,请把小于num是数放在数组的左边,等于num的数放在数组的中间,大于num是数放在数组的右边,要求额外空间为o(1),时间为o(n)
例如:
arr={4,5,6,7,5,1,2,3}
num=5
输出
0, 3, 2, 1, 5, 5, 7, 6
代码
public class netherlandsFlag {
public static int [] flag(int [] arr,int num,int L,int R) {
int Less = L-1;
int More = R+1;
int cur = L;
while (cur < More ) {
if (arr[cur]<num) {
swap(arr,++Less,cur++);
}else if (arr[cur]>num){
swap(arr,--More,cur);
}else {
cur++;
}
}
return new int [] { Less +1 ,More -1};
}
public static void swap(int arr [],int i,int j) {
int temp = arr [i];
arr[i] = arr[j];
arr[j] = temp;
}
}