zoukankan      html  css  js  c++  java
  • 力扣算法题—075颜色分类

    给定一个包含红色、白色和蓝色,一共 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

    此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

    注意:
    不能使用代码库中的排序函数来解决这道题。

    示例:

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

    进阶:

      • 一个直观的解决方案是使用计数排序的两趟扫描算法。
        首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。
      • 你能想出一个仅使用常数空间的一趟扫描算法吗
     1 #include "_000库函数.h"
     2 
     3 //本来使用sort函数简单无比
     4 //但是题目要求不让使用排序函数
     5 
     6 //解法一:计数再生成【两趟扫描】
     7 
     8 //class Solution {
     9 //public:
    10 //    void sortColors(vector<int>& nums) {
    11 //        int r = 0, w = 0, b = 0;//三种颜色出现次数计数
    12 //        for (auto a : nums)
    13 //            if (a == 0)++r;
    14 //            else if (a == 1)++w;
    15 //            else ++b;
    16 //        nums.clear();//重置
    17 //        nums.insert(nums.end(), r, 0);
    18 //        nums.insert(nums.end(), w, 1);
    19 //        nums.insert(nums.end(), b, 2);
    20 //    }
    21 //};
    22 
    23 //解法二,使用一趟扫描法
    24 class Solution {
    25 public:
    26     void sortColors(vector<int>& nums) {
    27         int n = nums.size();
    28         for (int i = 0;i<n;){
    29             vector<int>::iterator p = nums.begin() + i;
    30             if (nums[i] == 0) {
    31                 nums.erase(p, p + 1);//删除
    32                 nums.insert(nums.begin(), 1, 0);//前插
    33                 ++i;
    34             }
    35             else if (nums[i] == 2) {
    36                 nums.erase(p, p + 1);//删除
    37                 nums.insert(nums.end(), 1, 2);//后插
    38                 --n;
    39             }
    40             else//让1保留在原位
    41                 ++i;
    42         }
    43     }
    44 };
    45 
    46 
    47 void T075() {
    48     Solution s;
    49     vector<int>v;
    50     v = { 2,0,2,1,1,0 };
    51     s.sortColors(v);
    52     for (auto a : v)
    53         cout << a << "";
    54     cout << endl;
    55 }
  • 相关阅读:
    监控网页是否有变化
    设置开机自动启动进程
    nagios-调用脚本
    连接数据库出现10061错误
    小程序修改默认的radio样式
    小程序端,做类似于支付宝充值话费或流量的样式
    jq 在字符串中,去掉指定的元素
    vue 使用 proxyTable 解决跨域问题
    vue-cli 动态绑定图片失败
    vue-cli 使用 font-awesome 字体插件
  • 原文地址:https://www.cnblogs.com/zzw1024/p/10710984.html
Copyright © 2011-2022 走看看