内容简介:本文首发于公众号「五分钟学算法」,是个人网站:www.cxyxiaowu.com题目来源于 LeetCode 上第 75 号问题:颜色分类。题目难度为 Medium,目前通过率为 51.8% 。
本文首发于公众号「五分钟学算法」,是 图解 LeetCode 系列文章之一。
个人网站:www.cxyxiaowu.com
题目来源于 LeetCode 上第 75 号问题:颜色分类。题目难度为 Medium,目前通过率为 51.8% 。
题目描述
给定一个包含红色、白色和蓝色,一共 n 个元素的数组, 原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:不能使用代码库中的 排序 函数来解决这道题。
示例:
输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2] 复制代码
进阶:
- 一个直观的解决方案是使用计数排序的两趟扫描算法。 首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。
- 你能想出一个仅使用常数空间的一趟扫描算法吗?
题目解析
结合三路快排 partition 思路的应用。
设定两个索引,一个从左往右滑动 zero
,一个从右往左滑动 two
。
- 遍历
nums
,当nums[i]
的值为1时,i++
; - 当
nums[i]
的值为2时,two
的值先减1,而后交换nums[i]
与nums[two]
,此时在观察nums[i]
的值; - 当
nums[i]
的值为0时,zero++
,而后交换nums[i]
与nums[zero]
,i++
;当i = two
时,结束循环。
动画描述
代码实现
// 三路快速排序的思想 // 对整个数组只遍历了一遍 // 时间复杂度: O(n) // 空间复杂度: O(1) class Solution { public: void sortColors(vector<int> &nums) { int zero = -1; // [0...zero] == 0 int two = nums.size(); // [two...n-1] == 2 for(int i = 0 ; i < two ; ){ if(nums[i] == 1){ i ++; }else if (nums[i] == 2){ two--; swap( nums[i] , nums[two]); }else{ // nums[i] == 0 zero++; swap(nums[zero] , nums[i]); i++; } } } }; 复制代码
以上所述就是小编给大家介绍的《LeetCode 第 75 号问题:颜色分类》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 这个RGB到XYZ颜色空间转换算法有什么问题?
- 在向下滑动UIWebView以修复iOS7状态栏覆盖问题后,如何更改UIWebView背景颜色?
- 颜色搭配及颜色科学
- CSS教程:图片使用混合模式和颜色叠加filter滤镜,改变PNG图标颜色
- OpenGL ES入门: 渲染金字塔 - 颜色、纹理、纹理与颜色混合填充以及GLKit实现
- WebGL 纹理颜色原理
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Music Recommendation and Discovery
Òscar Celma / Springer / 2010-9-7 / USD 49.95
With so much more music available these days, traditional ways of finding music have diminished. Today radio shows are often programmed by large corporations that create playlists drawn from a limited......一起来看看 《Music Recommendation and Discovery》 这本书的介绍吧!