您的位置:首页 > 其它

LintCode: Sort Colors

2015-12-01 11:19 232 查看
通过交换,对0,1,2排序

使用三个标记[循环不变式]

i从前向后,记录最后一个0的位置

j从后向前,记录第一个2的位置

k从前向后,是遍历用的游标

[0..i-1]是0

[i..k-1]是1

[k,j-1]是未探测

[j..n-1]是2

初始k=0时,0,1,2的区域都是空,所有区域都是未探测,循环k=0..n-1

如果a[k] = 0=>swap(a[i++], a[k])

如果a[k] = 1=>无操作

如果a[k] = 2=>swap(a[--j], a[k--])

复杂度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 i = 0, j = nums.size();
for (int k = 0; k < j; ++k) {
if (nums[k] == 0) {
swap(nums[i++], nums[k]);
} else if (nums[k] == 2) {
swap(nums[--j], nums[k--]);
}
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: