Lintcode: 颜色分类
来源:互联网 发布:非农数据和黄金价格 编辑:程序博客网 时间:2024/06/05 12:05
给定一个包含红,白,蓝且长度为n的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红、白、蓝的顺序进行排序。
我们可以使用整数0,1和2分别代表红,白,蓝。
您在真实的面试中是否遇到过这个题? Yes
样例
注意
不能使用代码库中的排序函数来解决这个问题
说明
一个相当直接的解决方案是使用计数排序扫描2遍的算法。
首先,迭代数组计算0,1,2出现的次数,然后依次用0,1,2出现的次数去覆盖数组。
你否能想出一个仅使用常数级额外空间复杂度且只扫描遍历一遍数组的算法?
方法一
按照lintcode提示的方法,使用一个map,迭代数组,计算0,1,2出现的次数,然后依次使用次数重新给nums数组赋值,复杂度为O(n^2)
class Solution{public: /** * @param nums: A list of integer which is 0, 1 or 2 * @return: nothing */ void sortColors(vector<int> &nums) { // write your code here map<int, size_t> word_count; for(int i=0; i!=nums.size(); i++){ ++word_count[nums[i]]; } int i = 0; for(auto b=word_count.begin(); b!=word_count.end(); b++){ for(int j=0; j<b->second; j++){ nums[i++] = b->first; } } }};
方法二
另一种方法是只遍历一次,把nums分成三部分,把0放在nums的前部分,2放在后部分,1自然就在中间部分,复杂度为O(n)。
参考
class Solution{public: /** * @param nums: A list of integer which is 0, 1 or 2 * @return: nothing */ void sortColors(vector<int> &nums) { // write your code here int l = 0; int r = nums.size()-1; for(int i=0;i<min((int)nums.size(),r+1);) { if(nums[i]==0) { if(i==l) i++; else swap(nums[i],nums[l]); l++; } else if(nums[i]==2) { swap(nums[i],nums[r]); r--; } else i++; } }};
0 0
- LintCode-颜色分类
- lintcode-颜色分类-148
- Lintcode: 颜色分类
- 【Lintcode】颜色分类
- LintCode:颜色分类
- lintcode--颜色分类
- 颜色分类-LintCode
- [LintCode] 颜色分类 Sort Colors
- [Lintcode]Sort Colors颜色分类
- lintcode刷题——颜色分类
- 颜色分类
- 颜色分类
- 颜色分类
- 颜色分类
- 颜色分类
- 颜色分类
- LintCode : 排颜色 II
- LintCode:排颜色 II
- 《剑指Offer》面试题:复制复杂链表
- 安装完操作系统之后,linux 启动失败,报错为"Invalid magic number 0 error 13: invalid or unsupported executable format"
- 测试基础知识
- iOS8之后利用storyboard、xib动态获取行高
- 选择下拉框某一项 链接到页面
- Lintcode: 颜色分类
- 淘宝穿衣搭配算法_赛制描述
- Android开发中versionCode和versionName解析
- 《机器学习实战》学习笔记:利用Adaboost元算法提高分类性能
- android一些常用基础UI控件(比较适合给新手参考)
- 测试基础知识
- 用MJRefresh类库实现下拉刷新
- 利用向量化对图像做快速赋值
- phonegap+激光推送做ios的消息推送