leetcode.排序.75颜色分类-Java

1. 具体题目

给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。注意: 不能使用代码库中的排序函数来解决这道题。

示例:  输入: [2,0,2,1,1,0]  输出: [0,0,1,1,2,2]

进阶:一个直观的解决方案是使用计数排序的两趟扫描算法。首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。你能想出一个仅使用常数空间的一趟扫描算法吗?

2. 思路分析

扫描数组时,遇到“2”向右抛,遇到“0”向左抛,该方法需要设置三个指针。

3. 代码

 1 public void sortColors(int[] nums) {
 2         int red = 0, blue = nums.length - 1;
 3         for(int curr = 0; curr <= blue; ){
 4             if(nums[curr] == 0){
 5                 swap(nums, curr, red);
 6                 red++;    //指向第一个非“0”元素
 7                 curr++;
 8             }else if(nums[curr] == 2){
 9                 swap(nums, curr, blue);
10                 blue--;     //指向最后一个非“2”元素
11             }else{
12                 curr++;
13             }
14         }
15     }
16     private void swap(int[] nums, int i, int j){
17         int temp = nums[i];
18         nums[i] = nums[j];
19         nums[j] = temp;
20     }

猜你喜欢

转载自www.cnblogs.com/XRH2019/p/11965328.html