LintCode:颜色分类
2016-09-19 18:16
260 查看
题目:给定一个包含红,白,蓝且长度为 n 的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红、白、蓝的顺序进行排序。
我们可以使用整数 0,1 和 2 分别代表红,白,蓝。
挑战:一个相当直接的解决方案是使用计数排序扫描2遍的算法。首先,迭代数组计算 0,1,2 出现的次数,然后依次用 0,1,2 出现的次数去覆盖数组。
你否能想出一个仅使用常数级额外空间复杂度且只扫描遍历一遍数组的算法?
我的思路:扫描一遍,扫描到0时往前面放,扫描到2时往后面放,分别用两个变量记住首端0和末尾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
int pos0 = 0;
int pos2 = nums.size()-1;
for (int i = 0; i < nums.size()-1; i++) {
if (nums[i] == 2) {
while(nums[pos2] == 2)
pos2--;
if (i < pos2)
swap(nums[pos2], nums[i]);
pos2--;
}
if (nums[i] == 0) {
if ( i > pos0)
swap(nums[pos0], nums[i]);
pos0++;
}
}
}
};
我们可以使用整数 0,1 和 2 分别代表红,白,蓝。
挑战:一个相当直接的解决方案是使用计数排序扫描2遍的算法。首先,迭代数组计算 0,1,2 出现的次数,然后依次用 0,1,2 出现的次数去覆盖数组。
你否能想出一个仅使用常数级额外空间复杂度且只扫描遍历一遍数组的算法?
我的思路:扫描一遍,扫描到0时往前面放,扫描到2时往后面放,分别用两个变量记住首端0和末尾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
int pos0 = 0;
int pos2 = nums.size()-1;
for (int i = 0; i < nums.size()-1; i++) {
if (nums[i] == 2) {
while(nums[pos2] == 2)
pos2--;
if (i < pos2)
swap(nums[pos2], nums[i]);
pos2--;
}
if (nums[i] == 0) {
if ( i > pos0)
swap(nums[pos0], nums[i]);
pos0++;
}
}
}
};
相关文章推荐
- lintcode刷题——颜色分类
- Lintcode: 颜色分类
- Java for LintCode 颜色分类
- LintCode-颜色分类
- Lintcode 颜色排序2
- LintCode:排颜色 II
- 排颜色问题——数组 leetcode lintcode
- 排颜色问题——数组 leetcode lintcode
- LintCode 17 子集
- Lintcode主元素问题
- Lintcode 4 Ugly Number II
- lintcode--翻转链表
- Lintcode:A + B 问题
- lintCode-删除链表中倒数第n个节点
- lintcode&九章算法——No.60 搜索插入位置 ? 待解决
- lintcode 在O(1)时间复杂度删除链表节点
- LINTCODE——逆序对
- lintcode:带环链表
- Lintcode: Find Peak Element
- LintCode C++代码 余弦相似度;