题目连接:https://leetcode-cn.com/problems/sort-colors/
- LeetCode75
- 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
- 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
- 示例 1:
- 输入:nums = [2,0,2,1,1,0]
- 输出:[0,0,1,1,2,2]
- 示例 2:
- 输入:nums = [2,0,1]
- 输出:[0,1,2]
- 示例 3:
- 输入:nums = [0]
- 输出:[0]
- 示例 4:
- 输入:nums = [1]
- 输出:[1]
- 来源:力扣(LeetCode)
- 链接:https://leetcode-cn.com/problems/sort-colors
- 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
import java.util.Arrays;
class Solution {
// 使用三路快排实现 由于数组仅有0 1 2 三种数组 所以只需选取1作为基准点即可在O(n)时间复杂度内实现
public void sortColors(int[] nums) {
// num[0..zero] = 0
// num[zero+1...i] = 1
// num[two, n-1] = 2
int zero = -1, two = nums.length, i = 0;
while (i < two){
if (nums[i] < 1) {
zero++;
swap(nums, i, zero);
i++;
} else if (nums[i] == 1) {
i++;
} else {
two--;
swap(nums, two, i);
}
}
}
// 扫描一遍数组 记录 0 1 2 三个数字分别出现的次数 并以此为nums数组重新进行赋值
public void sortColors2(int[] nums) {
int[] res = new int[3];
for (int i = 0; i < nums.length; i++) {
if (nums[i] == 0)
res[0]++;
if (nums[i] == 1)
res[1]++;
if (nums[i] == 2)
res[2]++;
}
int t = 0;
for (int i = 0; i < res.length; i++) {
while (res[i] > 0) {
nums[t] = i;
res[i]--;
t++;
}
}
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void main(String[] args) {
int[] arr = {2,0,2,1,1,0};
int[] arr2 = Arrays.copyOf(arr, arr.length);
new Solution().sortColors(arr);
for (int a :
arr) {
System.out.print(a + " ");
}
System.out.println();
new Solution().sortColors2(arr2);
for (int a :
arr2) {
System.out.print(a + " ");
}
}
}