0%

leetCode-75:Sort Colors

问题描述

给定一个只包括 0、1、2 三种数字的的数组,要求用一次循环迭代,使用常量空间对数组进行升序排序。题目链接:**点我**

样例输入输出

输入:[2,0,2,1,1,0]

输出:[0,0,1,1,2,2]

输入:[2,0,1]

输出:[0,1,2]

问题解法

对于排序,如果采用常规做法,要么需要 O(nlgn) 的时间复杂度配合 O(1)的空间复杂度,要么需要 O(1) 的时间复杂度配合 O(n) 的空间复杂度,这都不满足题目的要求。鉴于排序中只有 0、1、2 三中数字,因此可以采用取巧的做法:用一个左指针指向数组从左到右第一个非 0 元素,用一个右指针指向数组从右到左第一个非 2 元素,从左到右遍历数组,如果当前元素是 0,则与左指针的元素交换值,并向右移动左指针,如果当前位置比右指针的值大,则交换这两个值,并移动右指针。代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class Solution
{
public void sortColors(int[] nums)
{
int left = 0;
int right = nums.length - 1;
int i = 0;
while (i <= right && left <= right)
{
if (nums[left] == 0)
{
left++;
if (i < left)
{
i = left;
}
continue;
}

if (nums[right] == 2)
{
right--;
continue;
}

if (nums[i] == 0)
{
int temp = nums[i];
nums[i] = nums[left];
nums[left] = temp;
left++;
}
else if (nums[i] > nums[right])
{
int temp = nums[i];
nums[i] = nums[right];
nums[right] = temp;
}
else
{
i++;
}
}
}
}