荷兰国旗问题(直观的“分三块”的问题)
给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,
等于num的数放在数组的中间,大于num的数放在数组的右边。
要求额外空间复杂度O(1),时间复杂度O(N)
LeetCode 75. 颜色分类
给定一个包含红色、白色和蓝色、共n 个元素的数组nums,原地对它们进行排序,
使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0、1 和 2 分别表示红色、白色和蓝色。
public static void method(int[] arr, int num) {
int l = 0;
int r = arr.length - 1;
int m = arr.length - 1;
while (l <= m) {
if (arr[l] == num) {
swapM(arr, l, m);
m--;
} else if (arr[l] > num) {
swapR(arr, l, m, r);
m--;
r--;
} else {
l++;
}
}
}
private static void swapR(int[] arr, int l, int m, int r) {
if (m < r) {
int temp = arr[r];
arr[r] = arr[l];
arr[l] = arr[m];
arr[m] = temp;
}else {
int temp = arr[r];
arr[r] = arr[l];
arr[l] = temp;
}
}
private static void swapM(int[] arr, int l, int m) {
int temp = arr[m];
arr[m] = arr[l];
arr[l] = temp;
}
评论区