当前位置:首页 > 编程笔记 > 正文
已解决

力扣每日一题75:颜色分类

来自网友在路上 159859提问 提问时间:2023-10-31 16:42:58阅读次数: 59

最佳答案 问答题库598位专家为你答疑解惑

题目描述:

给定一个包含红色、白色和蓝色、共 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]

提示:

  • n == nums.length
  • 1 <= n <= 300
  • nums[i] 为 01 或 2

进阶:

  • 你能想出一个仅使用常数空间的一趟扫描算法吗?

通过次数

575.9K

提交次数

948.9K

通过率

60.7%

方法一、统计0,1,2的个数,重写数组。

class Solution {
public:void sortColors(vector<int>& nums) {int red,white,blue;red=blue=white=0;for(auto i:nums){if(i==0) red++;else if(i==1) white++;else if(i==2) blue++;}int i=0;while(red--){nums[i]=0;i++;}while(white--){nums[i]=1;i++;}while(blue--){nums[i]=2;i++;}}
};

方法二、用一个指针表示数组头部,遍历两次数组,第一次将0交换到头部,第二次将1交换到头部的后面。剩下的二就在最后面了。

class Solution {
public:void sortColors(vector<int>& nums) {int n = nums.size();int ptr = 0;for (int i = 0; i < n; ++i) {if (nums[i] == 0) {swap(nums[i], nums[ptr]);++ptr;}}for (int i = ptr; i < n; ++i) {if (nums[i] == 1) {swap(nums[i], nums[ptr]);++ptr;}}}
};

方法三、双指针

对方法二的改进。用一个指针指向头部,一个指针指向尾部,扫描一趟,将0与头部数字交换,将2与尾部数字交换。

官方题解:

class Solution {
public:void sortColors(vector<int>& nums) {int n = nums.size();int p0 = 0, p2 = n - 1;for (int i = 0; i <= p2; ++i) {while (i <= p2 && nums[i] == 2) {swap(nums[i], nums[p2]);--p2;}if (nums[i] == 0) {swap(nums[i], nums[p0]);++p0;}}}
};作者:力扣官方题解
链接:https://leetcode.cn/problems/sort-colors/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"力扣每日一题75:颜色分类":http://eshow365.cn/6-28816-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!