数据结构(九十一)
学习数据结构与算法过程中的心得体会以及知识点的整理,方便我自己查找,也希望可以和大家一起交流。
—— 颜色分类 ——
1.题目描述
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。必须在不使用库的sort函数的情况下解决这个问题。
示例:
示例 1:
输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]
示例 2:
输入:nums = [2,0,1]
输出:[0,1,2]
2.代码
python
class Solution:
def sortColors(self, nums: List[int]) -> None:
lenth = len(nums)
if lenth < 2:
return
zero = -1
two = lenth - 1
i = 0
while i <= two:
if nums[i] == 0:
zero += 1
nums[i], nums[zero] = nums[zero], nums[i]
i += 1
elif nums[i] == 1:
i += 1
else:
nums[i], nums[two] = nums[two], nums[i]
two -= 1
c++
class Solution {
public:
void sortColors(vector<int> &nums) {
int size = nums.size();
if (size < 2) {
return;
}
int zero = 0;
int two = size;
int i = 0;
while (i < two) {
if (nums[i] == 0) {
swap(nums[zero], nums[i]);
zero++;
i++;
} else if (nums[i] == 1) {
i++;
} else {
two--;
swap(nums[i], nums[two]);
}
}
}
};
思路:本质上是排序,由于是三种数据,运用类似于快排中的交换思想就可以实现。三个指针分别为前中后,前指针负责将中指针指到的 0 交换到数组前面,后指针负责将中指针指到的的 2 交换到数组后面,当中指针和后指针相遇,整个数组排序完成。