首页 > 其他分享 > 将三个组排序

将三个组排序

时间:2023-08-20 15:22:10浏览次数:39  
标签:nums int res vector 三个 排序 dp size

给定数组只含1、2、3三种数
每次操作可以将一个数进行修改
将数组修改成非递减顺序的最少次数

1. 暴力(笨比做法)

枚举三种类型数分割的界限

class Solution {
public:
    int minimumOperations(vector<int>& nums) {
        int res = INT_MAX;
        int n = nums.size();
        vector<vector<int>> presum(n+1,vector<int>(4));

        for(int i=0;i<n;i++){
            presum[i+1][1] = presum[i][1]; //继承
            presum[i+1][2] = presum[i][2];  //继承
            presum[i+1][3] = presum[i][3]; //继承
            presum[i+1][nums[i]]++;//增加
        }

        for(int i=0;i<=n;i++){//枚举2的起始位置.一共n+1个候选位置
            for(int j=i;j<=n;j++){//枚举3的起始位置,可以将2覆盖掉
                //计算1的在位个数
                int cur = presum[i][1];
                //计算2的在位个数
                cur = cur + presum[j][2] - presum[i][2];
                //计算3的在位个数
                cur = cur + presum[n][3] - presum[j][3];
                res = min(res,n-cur);
            }
        }
        return res;
    }
};

2. 动态规划

将问题转化为最长递增子序列

class Solution {
public:
    int minimumOperations(vector<int>& nums) {
        int res = 0;
        int n = nums.size();
        vector<int> dp(4);//以三种数为结尾的最长递增子序列长度
        for(int i=0;i<n;i++)
            for(int j=nums[i];j>=1;j--){//从三个状态进行转移
                dp[nums[i]] = max(dp[nums[i]],dp[j]+1); 
                res = max(res,dp[nums[i]]);
            }
        return n - res;
    }
};

标签:nums,int,res,vector,三个,排序,dp,size
From: https://www.cnblogs.com/929code/p/17644040.html

相关文章

  • 纽约时间比加州时间早三个小时
    纽约时间比加州时间早三个小时侧耳侧耳倾听 58人赞同了该文章纽约时间比加州时间早三个小时,NewYorkis3hoursaheadofCalifornia,但加州时间并没有变慢。butitdoesnotmakeCaliforniaslow.有人22岁就毕业了,Someonegraduatedattheage......
  • 考研数据结构——每日一题[希尔排序]
    shell_sort希尔排序//每组内的下标是等差数列//c++中的sort是快排+插排【当排序到<28时改为插入排序】voidshell_sort()//希尔排序【分组的插入排序】不稳定(间隔d的分为一组){for(intd=n/3;d;d=d==2?1:d/3)//特判2,等于2就用1,(最后要用1,而2时d/3=......
  • 归并,基数排序及排序分析
    归并,基数排序及排序分析归并排序将两个或两个以上的有序子序列"归并"为一个有序的序列.归并排序的演示归并需要logn趟如何将两个有序序列合成一个有序序列?使用前面学的两个线性表的合并在同一个有序序列里面的合并操作归并排序算法分析归并排序方法的比较基数......
  • 选择冒泡插入排序 异或 二分 对数器
    算法时间复杂度O(x)空间复杂度O(x)数据状况是否影响时间复杂度表现选择排序n21否冒泡排序n21否插入排序n21是(最好情况下O(N))1.选择排序:遍历找出0~n-1最小的数放在0位置,遍历找出1~n-1最小的数放在1位置时间复杂度O(n2) 空间复杂度O(1)voidswap(vector<int>&nums,inti,intj......
  • 经典c语言排序算法
    前言前段时间偶然在公众号中看到了一篇汇总c语言排序算法的文章,感觉蛮不错的,这里直接copy记录下,学习积累一下。演示C语言经典排序算法(qq.com)排序算法简介1.算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(n......
  • 算法复杂度和简单排序
    选择排序和冒泡排序选择排序是O(n2),每次选取最大的,放在最前面,然后下次从第二个开始找到最后一个。冒泡也是O(n2),一直交换到最后。插入排序插入排序最坏是O(n2),最好是O(n),但是算法一般都是按照最坏的来。插入是先排序0-1,然后0-2,然后0-3,eq.:排序0-5时,0-4已经排序好了,只需要......
  • 蜗牛排序
    题目:  ——————————————————————————————————————————————————————————解答:#include<iostream>#include<vector>usingnamespacestd;vector<int>snail(vector<vector<int>>&array){vector<int>ret......
  • 【LeetCode2118. 建立方程】 group_concat指定分隔符,指定排序顺序
    目录题目地址题目描述代码题目地址https://leetcode.cn/problems/build-the-equation/description/题目描述Example2:输入:Terms表:+-------+--------+|power|factor|+-------+--------+|4|-4||2|1||1|-1|+-------+---......
  • 归并排序
    publicstaticvoidmerge(int[]arr,intlow,intmiddle,inthigh){    int[]temp=newint[high-low+1];    inti=low;               //第一个数组需要遍历的下标    intj=middle+1;          //第二......
  • 冒泡排序
    publicstaticvoidbubbleSort(int[]arr){for(inti=0;i<arr.length-1;i++){for(intj=0;j<arr.length-1-i;j++){if(arr[j]>arr[j+1]){inttemp=arr[j];arr[j]=arr[j+1];......