【模拟】【C++算法】2826. 将三个组排序

简介: 【模拟】【C++算法】2826. 将三个组排序

LeetCode2826. 将三个组排序

给你一个下标从 0 开始长度为 n 的整数数组 nums 。

从 0 到 n - 1 的数字被分为编号从 1 到 3 的三个组,数字 i 属于组 nums[i] 。注意,有的组可能是 空的 。

你可以执行以下操作任意次:

选择数字 x 并改变它的组。更正式的,你可以将 nums[x] 改为数字 1 到 3 中的任意一个。

你将按照以下过程构建一个新的数组 res :

将每个组中的数字分别排序。

将组 1 ,2 和 3 中的元素 依次 连接以得到 res 。

如果得到的 res 是 非递减顺序的,那么我们称数组 nums 是 美丽数组 。

请你返回将 nums 变为 美丽数组 需要的最少步数。

示例 1:

输入:nums = [2,1,3,2,1]

输出:3

解释:以下三步操作是最优方案:

  1. 将 nums[0] 变为 1 。
  2. 将 nums[2] 变为 1 。
  3. 将 nums[3] 变为 1 。
    执行以上操作后,将每组中的数字排序,组 1 为 [0,1,2,3,4] ,组 2 和组 3 都为空。所以 res 等于 [0,1,2,3,4] ,它是非递减顺序的。
    三步操作是最少需要的步数。
    示例 2:

输入:nums = [1,3,2,1,3,3]

输出:2

解释:以下两步操作是最优方案:

  1. 将 nums[1] 变为 1 。
  2. 将 nums[2] 变为 1 。
    执行以上操作后,将每组中的数字排序,组 1 为 [0,1,2,3] ,组 2 为空,组 3 为 [4,5] 。所以 res 等于 [0,1,2,3,4,5] ,它是非递减顺序的。
    两步操作是最少需要的步数。
    示例 3:

输入:nums = [2,2,2,2,3,3]

输出:0

解释:不需要执行任何操作。

组 1 为空,组 2 为 [0,1,2,3] ,组 3 为 [4,5] 。所以 res 等于 [0,1,2,3,4,5] ,它是非递减顺序的。

提示:

1 <= nums.length <= 100

1 <= nums[i] <= 3

模拟

由于性能要求并不高,故可以直接模拟,枚举i,j 使得nums[0,i) 是第一组,nums[i,j)是第二组,nums[j,n)是第三组。

注意边界情况:写测试用例的时候,补充1组为空的三种情况,2组为空的三种情况。

代码

核心代码

class Solution {
public:
  int minimumOperations(vector<int>& nums) {
    m_c = nums.size();
    //[0,i) [i,j) [j,n)
    int iRet = m_c;
    for (int i = 0; i <= m_c; i++)
    {
      for (int j = i; j <= m_c; j++)
      {
        int cur = 0;
        for (int k = 0; k < i; k++)
        {
          cur += (nums[k] != 1);
        }
        for (int k = i; k < j; k++)
        {
          cur += (nums[k] != 2);
        }
        for (int k = j ; k < m_c; k++)
        {
          cur += (nums[k] != 3);
        }
        iRet = min(iRet, cur);
      }
    }
    return iRet;
  }
  int m_c;
};


扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。

https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程

https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版

https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业
。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17

或者 操作系统:win10 开发环境: VS2022 C++17

如无特殊说明,本算法用**C++**实现。

相关文章
|
18小时前
|
算法 搜索推荐 C++
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)
9 0
|
18小时前
|
C++ 容器
C++之deque容器(构造、赋值、大小、插入与删除、存取、排序)
C++之deque容器(构造、赋值、大小、插入与删除、存取、排序)
4 1
|
2天前
|
算法 前端开发 安全
C++算法模板
C++算法模板
4 0
|
5天前
|
人工智能 算法 搜索推荐
蓝桥杯宝藏排序题目算法(冒泡、选择、插入)
以下是内容的摘要: 本文介绍了三种排序算法:冒泡排序、选择排序和插入排序。冒泡排序通过不断交换相邻的逆序元素逐步排序,最坏情况下需要 O(n^2) 次比较。选择排序在每轮中找到剩余部分的最小元素并放到已排序序列的末尾,同样具有 O(n^2) 时间复杂度。插入排序则是将每个元素插入到已排序序列的正确位置,时间复杂度也是 O(n^2),但空间复杂度为 O(1)。
|
5天前
|
算法 数据处理 C++
C++一分钟之-迭代器与算法
【6月更文挑战第21天】C++ STL的迭代器统一了容器元素访问,分为多种类型,如输入、输出、前向、双向和随机访问。迭代器使用时需留意失效和类型匹配。STL算法如查找、排序、复制要求特定类型的迭代器,注意容器兼容性和返回值处理。适配器和算法组合增强灵活性,但过度使用可能降低代码可读性。掌握迭代器和算法能提升编程效率和代码质量。
22 3
|
6天前
|
人工智能 算法 BI
【洛谷 P1803】凌乱的yyy _ 线段覆盖 题解(贪心算法+结构体排序)
**线段覆盖问题**: YYY 想在 NOIP 前参加最多比赛。给定 $n$ 场比赛的开始和结束时间,每场比赛必须连续且不能冲突。输入包含每场比赛的时间段,输出最多可参加的比赛数。$20\%$ 数据 $n\leq10$,$50\%$ 数据 $n\leq10^3$,$100\%$ 数据 $n\leq10^6$。解决方案:按结束时间排序比赛,若当前比赛开始时间晚于上一个结束时间,则计数加一。样例输入:3 场比赛,输出:2。AC C++ 代码实现了此算法。
9 0
|
6天前
|
算法 C++
【洛谷 P1223】排队接水(贪心算法+结构体排序)
该问题要求安排$n$个人的排队顺序以最小化平均等待时间。每个人接水需时$T_i$,解决方案是让接水时间短的人优先。给定$n\leq1000$和$t_i\leq10^6$,代码示例使用C++实现,通过排序使时间从小到大排列,然后计算平均等待时间。样例输入为10个人的时间数组,输出为优化后的排队顺序及平均等待时间(291.90)。
11 0
|
9天前
|
搜索推荐 算法
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
|
10天前
|
算法 前端开发 Linux
【常用技巧】C++ STL容器操作:6种常用场景算法
STL在Linux C++中使用的非常普遍,掌握并合适的使用各种容器至关重要!
35 10
|
12天前
|
存储 算法 C++
【数据结构与算法】:带你手搓顺序表(C/C++篇)
【数据结构与算法】:带你手搓顺序表(C/C++篇)