颜色分类 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 示例: 输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2] 进阶: 一个直观的解决方案是使用计数排序的两趟扫描算法。 首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。 你能想出一个仅使用常数空间的一趟扫描算法吗? 答:扫描一遍,一般用双指针或者三指针。 : nums[idx > p2] = 2 p2 = len(nums) - 1 while curr <= p2: if nums[curr] == 0: nums[curr], nums[p2] = nums[p2], nums[curr] p2 -= 1 else:
. - 力扣(LeetCode) 二·思路汇总: 思路: 创建两个指针分别找0和2并完成就位操作,利用遍历数组找到2可以缩小遍历右界的遍历范围, 依次遍历完就可得到最后的数组(也可以理解成,先把2排到最后面 nums+numsSize-1; int count=numsSize-1;//(也可忽略)记录每一次p2的指向,最后的指向应该是不为2. for(int i=0;i<=count;i++){//根据每次如果把2遍历到放到后面就可缩小下一次遍历范围设计for循环 if(nums[i]==2){ while(*p2 ==2&&count>0&&count>i){//找到p2指向不为2处,(排除都是2的数组以及在此次for循环内p2找不为2的数据时候跑到i的左边的情况) p2--; count --; } if(count>0){//可以交换的符合情况 swap(p2,&nums[i]); p2--; count--;
一、题目描述 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 二、题目解析 设置 3 个索引,left 指向数组的开始位置,right 指向数组的结束位置,index 指向数组的开始位置。 // https://www.algomooc.com/567.html // 作者:程序员吴师兄 // 代码有看不懂的地方一定要私聊咨询吴师兄呀 // 颜色分类( LeetCode 75 ):https 登录 AlgoMooc 官网获取更多算法图解 // https://www.algomooc.com/567.html // 作者:程序员吴师兄 // 代码有看不懂的地方一定要私聊咨询吴师兄呀 // 颜色分类 # 登录 AlgoMooc 官网获取更多算法图解 # https://www.algomooc.com/567.html # 作者:程序员吴师兄 # 代码有看不懂的地方一定要私聊咨询吴师兄呀 # 颜色分类
题目描述 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 示例: 输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2] 进阶: 一个直观的解决方案是使用计数排序的两趟扫描算法。 首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。 你能想出一个仅使用常数空间的一趟扫描算法吗? * Medium (41.41%) * Total Accepted: 297K * Total Submissions: 716.1K * Testcase Example: '[2,0,2,1,1,0 * * Example: * * * Input: [2,0,2,1,1,0] * Output: [0,0,1,1,2,2] * * Follow up: * * * A rather
给定一个包含红色、白色和蓝色,一共 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 = quick(l,r,nums); } }; 因为只有3组数字,最左边有一组,最右边有一组,中间有一组,所以把最左边和最右边都规整后,中间自然就规整,所以设置i,j代表左边放置0的下边,j为右边放置2的下标 ),j = nums.size() - 1; while(i < n && nums[i] == 0)i ++; while(j >= 0 && nums[j] == 2) ;k ++){ if(nums[k] == 0)swap(nums[i],nums[k]),i ++; else if(nums[k] == 2)
题目大意 给出一个由红、白、蓝三种颜色组成的数组,把相同颜色的元素放到一起,并整体按照红、白、蓝的顺序。用0表示红色,1表示白色,2表示蓝色。这题也称为荷兰国旗问题。 解题思路 参考: https://shenjie1993.gitbooks.io/leetcode-python/075%20Sort%20Colors.html 三指针:如果只有两种颜色,那么很容易想到一前一后两个指针向中间遍历 ,颜色不对就交换位置。 三种颜色仍然可以这么做,只不过要多一个指针,前后两个指针用来分隔已经排好的红色和蓝色,中间的指针来遍历元素: 如果是红色,那么和前指针交换,并两个一起向后移,前指针换过来的一定是白色的,因为中指针已经扫描过那些元素了 如果是白色,那么继续向后移 如果是蓝色,那么和后指针交换,后指针向前移,中指针不能后移,因为此时不确定换过来的元素是什么颜色 代码 class Solution(object): def
思路: 看到这样的按数字分类,第一时间感觉应该用排序,这样的话就直接按大小分好了。但是要求不用排序,且一遍扫描,就算了。 第二种思路: 基本思路:定义俩数字,0值的最右位置zero,以及2值最左位置tow 使得,[0, zero] = 0, (zero, i) = 1,(two, len - 1] = 2,剩下的就是把数字按这个排了 第三种思路: 赋值法,假定所有数字都是2;然后对0和1数字进行计数和赋值; 代码2: class Solution { public void sortColors(int[] nums) { int len = nums.length; if (nums.length < 2) { return; { int temp = nums[index1]; nums[index1] = nums[index2]; nums[index2
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 示例: 输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2] 进阶: 一个直观的解决方案是使用计数排序的两趟扫描算法。 首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。 你能想出一个仅使用常数空间的一趟扫描算法吗? 解:利用本题只有0,1,2三种元素,很容易可以想到可以利用快排的变种:三way快排和双轴快排,利用red,white,blue三个指针将数组分为四部分,red左边的都是0,red到white中间都是1, white到blue中间都是未扫描排序的,blue右边的都是2,用white来扫描数组。
一,颜色分类 1,问题简述 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 进阶: 你可以不使用代码库中的排序函数来解决这道题吗?你能想出一个仅使用常数空间的一趟扫描算法吗? 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] 提示: n == nums.length 1 <= n <= 300 nums[i] 为 0、1 或 2 { public static void main(String[] args) { int[] nums = {2, 0, 2, 1, 1, 0}; sortColors
这道题两种做法,一种是用计数排序,因为告诉了你只有3种数字,所以直接创建一个长度为3的数组arr,然后遍历一遍原数组,每出现一次某个数,arr对应位置的值就加加。最后依次输出arr即可
用 for 循环遍历数组,当遇到 0 或者 1 时,分别与标记位置进行交换,可用题目示例来举例,题目给的是 nums = [2,0,2,1,1,0],过程如表格所示: i = 0 2 0 2 即 i 所在位置的数与 p1 位置所在的数交换,在这里 p0 与 p1 指向的是同一个数,因此不用换,结果如下: 0 2 2 1 1 0 p1,p0,i i = 2 0 2 2 1 1 0 i = 3 0 2 2 1 1 0 p0,p1 i 此时 i 所在位置的数为 1 ,则与 p1 进行交换,结果如下: 0 1 2 2 1 0 p0 p1 i 在这里可以推一下,假如上边遇到 i = 4 0 1 2 2 1 0 p0 p1 i 此时 i 所在位置的数为 1 ,则与 p1 进行交换,结果如下: 0 1 1 2 2 0 p0 p1 i i = 5 0 1 1 2 颜色分类
给定一个包含红色、白色和蓝色,一共 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 = ),j = nums.size() - 1; while(i < n && nums[i] == 0)i ++; while(j >= 0 && nums[j] == 2) ;k ++){ if(nums[k] == 0)swap(nums[i],nums[k]),i ++; else if(nums[k] == 2)
原题 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 示例: 输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2] 进阶: * 一个直观的解决方案是使用计数排序的两趟扫描算法。 下标0 到下标 p0 之间存放数字0,下标 p0 到 p2 之间存放数字1,下标 p2 到 下标 (nums.length - 1) 之间存放数字2。 current 指针从下标0开始遍历,如果值为0,则和 p0 交换,如果值为2,则和 p2 交换。 则和 p2 交换,p2指针往前移动 if (nums[current] == 2) { nums[current] = nums[p2];
# LeetCode-75-颜色分类 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 示例1: 输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2] 进阶: 一个直观的解决方案是使用计数排序的两趟扫描算法。 方法2、三指针一次遍历(荷兰国旗问题): 我们用三个指针(p0, p2 和curr)来分别追踪0的最右边界,2的最左边界和当前考虑的元素。 初始化2的最左边界 :p2 = n - 1。在整个算法执行过程中 nums[idx > p2] = 2. 初始化当前考虑的元素序号 :curr = 0. 若 nums[curr] = 2 :交换第 curr个和第 p2个元素,并将 p2指针左移 。 若 nums[curr] = 1 :将指针curr右移。
一、题目描述 给定一个包含红色、白色和蓝色,一共 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 = 最好情况下为log2(n+1) 最坏情况下,因为要进行n-1次递归调用,所以栈的深度为O(n); 平均情况下,栈的深度为O(log_{2}n). 因而空间复杂度在最坏情况下为O(n),平均情况下为O(log_{2}n) 复杂度: 快速排序的运行时间与划分是否对称有关,而后者又与具体使用的划分算法有关。
题目 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 注意: 不能使用代码库中的排序函数来解决这道题。 示例: 输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2] 进阶: 一个直观的解决方案是使用计数排序的两趟扫描算法。 首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。 你能想出一个仅使用常数空间的一趟扫描算法吗? int[] nums) { int temp = nums[nums1]; nums[nums1] = nums[nums2]; nums[nums2]
颜色分类 - 力扣(LeetCode) 只需排序三种,可以记录0和1的个数,然后直接原地赋值 class Solution { public: void sortColors(vector<int nums[i] = 1; for (int i = zero + one; i < nums.size(); i++) nums[i] = 2;
今天和大家聊的问题叫做 颜色分类,我们先来看题面: https://leetcode-cn.com/problems/sort-colors/ Given an array nums with n objects 题意 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 样例 示例: 输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2] 进阶: 一个直观的解决方案是使用计数排序的两趟扫描算法。 既然颜色只有三种,那么当我们排完序之后,整个数组会被分成三个部分,头部是0,中间是1,尾部是2。 我们可以用一个区间来收缩1的范围,假设我们当前区间的首尾元素分别是l和r。 假设我们读入的数是1,那么我们需要把b延长一个单位,但是这样带来的后果是2的部分被侵占,所以需要将2也延长,补上被1侵占的一个单位。如果读到的是2,那么直接延长2即可,因为2后面没有其他颜色了。
题目 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 示例: 输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2] 进阶: 一个直观的解决方案是使用计数排序的两趟扫描算法。 首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。 你能想出一个仅使用常数空间的一趟扫描算法吗? 2. 解题 i指向0的末尾下一位,j指向2的开始前一位,k表示当前遍历的位置 当前数字为2时,其与j交换,j的位置是2,j--,k的位置不知道是啥,k不变 当前是0时,其与i交换,i的位置是0了,i++,k+
接下来会分类给大家分享常考算法题目。很多朋友也是看着这套系列算法拿到很多offer!所以也是想分享给更多朋友,帮助到有需要的朋友。分类数组-三路快排题目75. 颜色分类给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地**对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 示例 1:输入: nums = [2,0,2,1,1,0]输出: [0,0,1,1,2,2]示例 2:输入: nums = [2,0,1]输出: [0,1,2]解释1.定义一个变量zero,初始值为-1 ,zero变量用来表示0...zero区间全部放0 2.定义一个变量two,初始值为数组的长度,two变量用来表示two...n-1区间全部放2 3.zero+1...n-1区间全部放1,这样数组中就变成了 然后将当前的元素2和two所在的位置交换一下位置,此时这个2就移动到了右边,这个时候不能将 i 向右移动一位,需要继续判断 当前这个元素是否为0 7.如果遍历的当前元素是0,先将zero向右移动一位,