颜色分类Ⅱ

2023-11-03

题目
在这里插入图片描述
方法一:分治法

算法思路:
每次选定一个中间的颜色,这个中间的颜色用给出的k来决定,将小于等于中间的颜色的就放到左边,大于中间颜色的就放到右边,然后分别再递归左右两半。
代码思路:
递归函数设置四个参数,序列需要处理区间的左右端点和处理的颜色区间
根据给定的颜色区间决定中间的颜色
将小于等于中间的颜色的就放到左边,大于中间颜色的就放到右边
递归左右两半,直到颜色区间长度等于1

class Solution {
public:
    //分治法
    void sortColors2(vector<int> &colors, int k) {
    //如果colors数组为空或者只有1个数
    //直接返回原数组
        if(colors.size()<2){
            return ;
        }
        mysort1(colors,0,colors.size()-1,1,k);
    }
    //start和end分别是排序范围的开始和结束,colorstart,colorend分别是需要排序颜色的大小
    void mysort1(vector<int>&colors,int start,int end,int colorstart,int colorend){
        int left=start,right=end;
        if(left>=right||colorstart==colorend){
            return ;
        }
        //把小于colorkey的放在左边,大于colorkey的放在右边
        int colorkey=(colorend-colorstart)/2+colorstart;
        while(left<=right){
        //在左边区间找到一个大于colorkey的数
            while(left<=right&&colors[left]<=colorkey){
                left++;
            }
        //在右边区间找到一个小于colorkey的数
            while(left<=right&&colors[right]>colorkey){
                right--;
            }
            if(left<=right){
                swap(colors[left],colors[right]);
            }
        }
        //对左区间和右区间分别进行递归
        mysort1(colors,start,right,colorstart,colorkey);
        mysort1(colors,left,end,colorkey+1,colorend);
    }
};

方法二:在原数组进行的计数排序

算法思路
我们用负数代表数字出现的次数,例如colors[i]=-cnt表示数字i出现了cnt次
代码思路
我们从左往右遍历colors数组

  • 若colors[i] > 0且colors[colors[i]] < 0,那么colors[colors[i]] -= 1
  • 若colors[i] > 0且colors[colors[i]] > 0,那么先用临时变量temp存下colors[i],将colors[colors[i]]赋值给colors[i],再将colors[temp] = -1
  • 若colors[i] < 0,跳过
    倒着输出每种颜色
    另外注意数组下标是从0开始,为了避免n==k导致数组越界的情况,colors[i]对应的计数位为colors[colors[i] - 1]
class Solution {
public:
    //基于原数组的计数排序法
    void sortColors2(vector<int> &colors, int k) {
        if(colors.size()<2){
            return ;
        }
        mysort2(colors,k);
    }
    void mysort2(vector<int>&colors,int k){
        int index=0;
        while(index<colors.size()){
            //如果index已经是计数位,就直接跳过
            if(colors[index]<=0){
                index++;
            }
            //如果index不是计数位
            else{
                //因为数组的下标是0开始的,所以映射需要减1
                //比如数值为1的个数存放在colors[0]的位置
                //数值为2的个数存放在colors[1]的位置
                int tmp=colors[index]-1;
                //如果colors[tmp]是计数位
                if(colors[tmp]<=0){
                    colors[tmp]--;
                    //因为colors[index]被计数了,所以index这个位置被置为0
                    colors[index]=0;
                    index++;
                }
                //如果两个都不是计数位
                //由于是对index进行计数,所以需要保存colors[tmp]的数值
                //然后把colors[index]位置作为是计数位
                else{
                    swap(colors[tmp],colors[index]);
                    colors[tmp]=-1;
                }
            }
        }
        //倒着打印数组
        int num=colors.size()-1;
        //值为k的个数存放在数组下标为k-1的位置
        while(k>0){
            for(int j=0;j>colors[k-1];j--){
                colors[num--]=k;
            }
            k--;
        }
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

颜色分类Ⅱ 的相关文章

随机推荐

  • 再聊聊财务自由

    前段时间有人在我星球讨论财务自由 说自由的本质是选择权 有读者觉得大受启发 我就翻了一下旧文 我2017年就说过了啊 谈谈财务自由 但时过境迁 其实我想改变一下之前的说法 所谓财务自由 你虽然拥有了选择权 但并不是无限选择的权力 坦白说 这
  • 电影知识图谱和基于模板的问答系统构建

    目录 前言 一 知识图谱的构建 二 问答系统的构建 1 数据准备 1 1数据获取 1 2数据处理 1 3数据读入 1 4代码 2 问答系统设计 2 1整体流程 2 2实体识别和问题分类 2 3 问题结果查询 2 4问答模板的匹配 三 优化方
  • requests.post 小坑: 默认无超时,会阻塞

    一 遇到问题 最近遇到一个小问题 发现我的进程在调某个 API 的时候 不能正常 work 了 马上一顿 strace p pid 操作 定睛一看 发现我的进程卡在了 recvfrom 23 不动了 一直不会进入 accept 或者 epo
  • 论文笔记 Spectral Regularization Algorithms for Learning Large IncompleteMatrices (soft-impute)

    2010 JMLR 0 摘要 使用凸松弛技术为大规模矩阵完成问题提供一系列正则化低秩解决方案 论文算法 SOFT IMPUTE 迭代地用从软阈值 SVD 获得的元素替换缺失的元素 通过热启动 这使算法能够有效地计算正则化参数值网格上解决方案
  • iOS架构-组件化(Carthage管理工具)

    一 Carthage项目管理工具使用 Step 1 安装 更新Homebrew工具 1 usr bin ruby e curl fsSL https raw githubusercontent com Homebrew install ma
  • 遍历列表中的字典并取出其中的值报错string indices must be integers

    今天写爬虫的时候遇到一个问题 为了方便看我截取出其中的一部分放到测试文件中测试 我想要的是使用for循环遍历列表中的每一个字典然后取出其中某个key对应的value值 但是却报错了 报错显示string indices must be in
  • Python 数据降噪处理的四种方法——均值滤波、小波变换、奇异值分解、改变binSize

    Python 数据降噪处理的四种方法 均值滤波 小波变换 奇异值分解 改变binSize github主页 https github com Taot chen 一 均值滤波 1 算法思想 给定均值滤波窗口长度 对窗口内数据求均值 作为窗口
  • 三基色配色表java_【调色】颜色配色表 适合重彩搭配用

    三基色是指红 绿 蓝三色 各自对应的波长分别为700nm 546 1nm 435 8nm 原色 又称为基色 即用以调配其他色彩的基本色 原色的色纯度最高 最纯净 最鲜艳 可以调配出绝大多数色彩 而其他颜色不能调配出三原色 三原色通常分为两类
  • mysql怎么更新单一值_MySQL 如何快速全表更新某个字段值

    这个问题似乎没有什么好的解决方法 有个朋友提示 能否将1千万条记录拆分成多个部分 并发更新 这种比单纯的一条SQL全表更新要快一些 真的是这样吗 我做了一个实验 1 环境配置 机器配置 16核 32G MySQL 版本 5 7 19 1主2
  • 2-蛇形矩阵

    蛇形矩阵 首先我们来看问题 上面这个矩阵我们要怎么将它输出呢 我们仔细观察这个矩阵 不难发现它是有一定规律的 它的数字沿着一条蛇一样弯曲排布 那么问题来了 我们在电脑中输出都是以一行一行这样来输出的 这个矩阵的顺序明显不符合以行为参考时的输
  • 利用MMPose进行姿态估计(训练、测试全流程)

    前言 MMPose是一款基于PyTorch的姿态分析开源工具箱 是OpenMMLab项目成员之一 主要特性 支持多种人体姿态分析相关任务 2D多人姿态估计 2D手部姿态估计 动物关键点检测等等 更高的精度和更快的速度 包括 自顶向下 和 自
  • C语言做的一个简单的系统

    这个适合初学者去学习 include
  • idea的控制台无法输入

    1 进入help gt Edit Custom VM Options 2 添加 Deditable java test console true 然后重启IDEA即可生效
  • 机器学习:集成学习

    一 集成学习算法简介 1 什么是集成学习 集成学习通过建立几个模型来解决单一预测问题 它的工作原理是生成多个分类器 模型 各自独立地学习和作出预测 这些预测最后结合成组合预测 因此优于任何一个单分类的做出预测 2 复习 机器学习的两个核心任
  • 死锁的成因和对应的解决方案

    目录 一 什么是死锁 二 产生死锁的三个典型场景 案例一 一个线程一把锁 案例二 两个线程两把锁 死锁原因分析 解决办法 案例三 N个线程M把锁 解决办法 三 形成死锁的四个条件 一 什么是死锁 所谓死锁 是指多个进程在运行过程中因争夺资源
  • mysql中脏读,幻读,不可重复读是什么意思及其解决办法

    mysql中脏读 幻读 不可重复读是什么意思 https blog csdn net lafengwnagzi article details 80660631 一个事务读到另外一个事务还没有提交的数据 我们称之为脏读 解决方法 把事务隔离
  • v-if与v-for的不共用问题

    v for的优先级比v if高 所以会优先执行v for 如果你需要v if与v for共用的话 需要把v if放在容器上 ul li user name li ul 这一段代码中 会先去循环v for 循环后再循环一次 对v if的进行显
  • 华为Android10怎样root,华为手机怎么root?详细的root教程在此

    随着华为手机的热销 相信不少机友都入手了华为手机 华为手机有华为和荣耀两个系列 那华为手机怎么获取root权限呢 很多入手了华为手机的朋友都在纠结于root权限获取的问题之上 因为找不到合适的华为手机root的方法 为此 小编为大家带来了华
  • 一图让你明白爬虫与反爬虫进化过程

    爬虫与发爬虫的厮杀 一方为了拿到数据 一方为了防止爬虫拿到数据 谁是最后的赢家 重新理解爬虫中的一些概念 爬虫 自动获取网站数据的程序 反爬虫 使用技术手段防止爬虫程序爬取数据 误伤 反爬虫技术将普通用户识别为爬虫 这种情况多出现在封ip中
  • 颜色分类Ⅱ

    题目 方法一 分治法 算法思路 每次选定一个中间的颜色 这个中间的颜色用给出的k来决定 将小于等于中间的颜色的就放到左边 大于中间颜色的就放到右边 然后分别再递归左右两半 代码思路 递归函数设置四个参数 序列需要处理区间的左右端点和处理的颜