LintCode: Sort Colors

简介:

通过交换,对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)

复制代码
 1 class Solution{
 2 public:
 3     /**
 4      * @param nums: A list of integer which is 0, 1 or 2 
 5      * @return: nothing
 6      */    
 7     void sortColors(vector<int> &nums) {
 8         // write your code here
 9         int i = 0, j = nums.size();
10         for (int k = 0; k < j; ++k) {
11             if (nums[k] == 0) {
12                 swap(nums[i++], nums[k]);
13             } else if (nums[k] == 2) {
14                 swap(nums[--j], nums[k--]);
15             }
16         }
17     }
18 };
复制代码

 


本文转自ZH奶酪博客园博客,原文链接:http://www.cnblogs.com/CheeseZH/p/5009541.html,如需转载请自行联系原作者

相关文章
Leetcode Find Minimum in Rotated Sorted Array 题解
对一个有序数组翻转, 就是随机取前K个数,移动到数组的后面,然后让你找出最小的那个数,注意,K有可能是0,也就是没有翻转。
47 0
|
索引
LeetCode 75. Sort Colors
给定一个具有红色,白色或蓝色的n个对象的数组,对它们进行就地排序,使相同颜色的对象相邻,颜色顺序为红色,白色和蓝色。 这里,我们将使用整数0,1和2分别表示红色,白色和蓝色。 注意:您不应该使用库的排序功能来解决此问题。
46 0
LeetCode 75. Sort Colors
|
Python
LeetCode 378. Kth S Element in a Sorted Matrix
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。 请注意,它是排序后的第k小元素,而不是第k个元素。
106 0
LeetCode 378. Kth S Element in a Sorted Matrix
|
索引
LeetCode 81. Search in Rotated Sorted Array II
假设按升序排序的数组在事先未知的某个枢轴处旋转。 (例如, [0,0,1,2,2,5,6] 可能变成 [2,5,6,0,0,1,2]). 给定一个要搜索的目标值T, 如果该目标值能在数组中找到则返回true,否则返回false。
88 0
LeetCode 81. Search in Rotated Sorted Array II
[LeetCode]--75. Sort Colors
Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue. Here, we will use the
1203 0