颜色分类(LintCode)

颜色分类

给定一个包含红,白,蓝且长度为n的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红、白、蓝的顺序进行排序。

我们可以使用整数0,1和2分别代表红,白,蓝。

样例

注意

不能使用代码库中的排序函数来解决这个问题

说明

一个相当直接的解决方案是使用计数排序扫描2遍的算法。

首先,迭代数组计算0,1,2出现的次数,然后依次用0,1,2出现的次数去覆盖数组。

你否能想出一个仅使用常数级额外空间复杂度且只扫描遍历一遍数组的算法?

代码写的乱糟糟的,难得写了注释。

想法就是把0交换至左边,2交换至右边。

 1 class Solution {
 2     //总耗时: 14896 ms
 3
 4     /**
 5      * @param nums: A list of integer which is 0, 1 or 2
 6      * @return: nothing
 7      */
 8     public void sortColors(int[] nums) {
 9         int low = 0;
10         int high = nums.length-1;
11         //先找到最左的非0和最右的非2
12         while(nums[low] == 0 && low < high) low++;
13         while(nums[high] == 2 && low < high) high--;
14
15         while(nums[low] == 2 || nums[high] == 0 && low < high) {
16             //如果最左非0是2或者最右非2是0,则将其换至右边或左边
17             if(nums[low] == 2) {
18                 if(nums[high] == 0) {
19                     nums[low++] = 0;
20                     nums[high--] = 2;
21                 }else {
22                     nums[high--] = 2;
23                     nums[low] = 1;
24                 }
25             }else {
26                 if(nums[high] == 0) {
27                     nums[low++] = 0;
28                     nums[high] = 1;
29                 }
30             }
31             //找到最左的非0和最右的非2
32             while(nums[low] == 0 && low < high) low++;
33             while(nums[high] == 2 && low < high) high--;
34         }
35
36         for(int i=low+1;i<high && low < high;i++) {
37             //此时最左非0和最右非2都是1,用i找到0或2,交换到左端或右端
38             if(nums[i] == 0) {
39                 nums[low++] = 0;
40                 nums[i] = 1;
41             }else {
42                 if(nums[i] == 2) {
43                     nums[high--] = 2;
44                     nums[i] = 1;
45                 }
46             }
47
48             //找到最左的非0和最右的非2
49             while(nums[low] == 0 && low < high) low++;
50             while(nums[high] == 2 && low < high) high--;
51
52             while(nums[low] == 2 || nums[high] == 0 && low < high) {
53                 //如果最左非0是2或者最右非2是0,则将其换至右边或左边
54                 if(nums[low] == 2) {
55                     if(nums[high] == 0) {
56                         nums[low++] = 0;
57                         nums[high--] = 2;
58                     }else {
59                         nums[high--] = 2;
60                         nums[low] = 1;
61                     }
62                 }else {
63                     if(nums[high] == 0) {
64                         nums[low++] = 0;
65                         nums[high] = 1;
66                     }
67                 }
68                 //找到最左的非0和最右的非2
69                 while(nums[low] == 0 && low < high) low++;
70                 while(nums[high] == 2 && low < high) high--;
71             }
72             //若此时的low>=i,显然要重新设置i
73             if(i <= low) i = low+1;
74         }
75         //当上面的循环结束时,分类就已完成,只遍历了一次nums,辅助空间为常数
76     }
77 }

时间: 2024-10-06 18:43:12

颜色分类(LintCode)的相关文章

LeetCode 75. 颜色分类(Sort Colors) 30

75. 颜色分类 75. Sort Colors 题目描述 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示红色.白色和蓝色. 注意: 不能使用代码库中的排序函数来解决这道题. 每日一算法2019/6/2Day 30LeetCode75. Sort Colors 示例: 输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2] 进阶: 一个直观的解决方

三指针(三指针排序只有三种元素的数组)--12--三指针--颜色分类

颜色分类 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示红色.白色和蓝色. 注意:不能使用代码库中的排序函数来解决这道题. 示例: 输入: [2,0,2,1,1,0]输出: [0,0,1,1,2,2] 题目来源:力扣(LeetCode)题目链接:https://leetcode-cn.com/problems/sort-colors 分析 题目可通过快排.三指针,

LeetCode——75. 颜色分类

75. 颜色分类 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示红色.白色和蓝色. 注意: 不能使用代码库中的排序函数来解决这道题. 示例: 输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2] 进阶: 一个直观的解决方案是使用计数排序的两趟扫描算法. 首先,迭代计算出0.1 和 2 元素的个数,然后按照0.1.2的排序,重写当前数组. 你能想出

148. 颜色分类

给定一个包含红,白,蓝且长度为 n 的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红.白.蓝的顺序进行排序. 我们可以使用整数 0,1 和 2 分别代表红,白,蓝. 注意事项 不能使用代码库中的排序函数来解决这个问题.排序需要在原数组中进行. 样例 给你数组 [1, 0, 1, 2], 需要将该数组原地排序为 [0, 1, 1, 2]. 挑战 一个相当直接的解决方案是使用计数排序扫描2遍的算法. 首先,迭代数组计算 0,1,2 出现的次数,然后依次用 0,1,2 出现的次数去覆盖数组.

LeetCode 75. 颜色分类

给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示红色.白色和蓝色. 注意:不能使用代码库中的排序函数来解决这道题. 示例: 输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2] 进阶: 一个直观的解决方案是使用计数排序的两趟扫描算法.首先,迭代计算出0.1 和 2 元素的个数,然后按照0.1.2的排序,重写当前数组. 你能想出一个仅使用常数空间的一

75. 颜色分类

给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示红色.白色和蓝色. 注意: 不能使用代码库中的排序函数来解决这道题. 示例: 输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2] 进阶: 一个直观的解决方案是使用计数排序的两趟扫描算法. 首先,迭代计算出0.1 和 2 元素的个数,然后按照0.1.2的排序,重写当前数组. 你能想出一个仅使用常数空间

颜色分类

题目链接: 涉及知识:数组.双指针 问题描述: ? 该问题又被称为荷兰国旗问题,大概意思为给每一个数字指定一种颜色,并按荷兰国旗颜色的顺序进行调整. 算法思想: ? 设置三个指针,初始状态 low 指针指向最低位, high 指针指向高位,并设置 cur 指针指向当前的元素.cur 指针从头开始遍历. 初始化 0 的最右边界:low = 0. 初始化 2 的最左边界 :high = n - 1. 初始化当前考虑的元素序号 :cur = 0. While cur <= high : 若 nums[

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的排序,重写当前数组.你能想出一个仅使用常

排序和搜索----颜色分类

给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示红色.白色和蓝色. 注意:不能使用代码库中的排序函数来解决这道题. 示例: 输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2] 进阶: 一个直观的解决方案是使用计数排序的两趟扫描算法.首先,迭代计算出0.1 和 2 元素的个数,然后按照0.1.2的排序,重写当前数组. 你能想出一个仅使用常数空间的一