148. 颜色分类

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

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

注意事项

不能使用代码库中的排序函数来解决这个问题。
排序需要在原数组中进行。

样例

给你数组 [1, 0, 1, 2], 需要将该数组原地排序为 [0, 1, 1, 2]

挑战

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

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

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

比较容易联想到快排,把所有0扔到1左边,把所有2扔到1右边,问题就在于我们怎样找扔的位置

因为我们不知道1在哪,所以把0扔到最左(left),2扔到最右(right),初始化left=0,right=size()-1

2比较好处理,查到一个2就往最后right扔,扔一次就right--

那么怎么找0该扔到的位置?

有这么几种情况

1、i=left,就是说查到的0就在该在的位置,那么这时候需要i++,left++

2、i!=left,那么这时候就需要交换,交换后left位置为0,所以需要left++

 1 void sortColors(vector<int> &nums) {
 2         // write your code here
 3         int left=0, right=nums.size()-1;
 4         int index=0;
 5         while(index<=right){
 6             if(nums[index]==0){
 7                 if(index==left){
 8                     index++;
 9                 }
10                 else{
11                     swap(nums[index], nums[left]);
12                 }
13                 left++;
14             }
15             else if(nums[index]==2){
16                 swap(nums[index], nums[right]);
17                 right--;
18             }
19             else{
20                 index++;
21             }
22         }
23     }

看的出来,查到1就直接跳过了,只处理查到0和2的情况

原文地址:https://www.cnblogs.com/TheLaughingMan/p/8171250.html

时间: 2024-10-29 16:45:04

148. 颜色分类的相关文章

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] 进阶: 一个直观的解决方

颜色分类(LintCode)

颜色分类 给定一个包含红,白,蓝且长度为n的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红.白.蓝的顺序进行排序. 我们可以使用整数0,1和2分别代表红,白,蓝. 样例 注意 不能使用代码库中的排序函数来解决这个问题 说明 一个相当直接的解决方案是使用计数排序扫描2遍的算法. 首先,迭代数组计算0,1,2出现的次数,然后依次用0,1,2出现的次数去覆盖数组. 你否能想出一个仅使用常数级额外空间复杂度且只扫描遍历一遍数组的算法? 代码写的乱糟糟的,难得写了注释. 想法就是把0交换至左边,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的排序,重写当前数组. 你能想出

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