一、给定一个数组arr,和一个数num,请把小于等于num的数放在数组的左边,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)
public void method(int[] arr, int num) {
int index = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] < num) {
swap(arr, index++, i);
}
}
}
private void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
荷兰国旗问题:
二、给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边
public void method(int[] arr, int num) {
int index = 0;
int left = 0;
int right = arr.length - 1;
while (index < right) {
if (arr[index] < num) {
swap(arr, index++, left++);
} else if (arr[index] > num) {
swap(arr, index, right--);
} else {
index++;
}
}
}
private void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}