首页 > 其他分享 >找出最长等值子数组

找出最长等值子数组

时间:2023-08-20 17:55:20浏览次数:33  
标签:找出 right 等值 nums int tricks ++ 数组 cur

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。
如果子数组中所有元素都相等,则认为子数组是一个等值子数组 。
从 nums 中删除最多 k 个元素后,返回可能的最长等值子数组的长度。

1. 哈希分组 + 反悔队列

蠢逼做法
class Solution {
public:
    int longestEqualSubarray(vector<int>& nums, int k) {
        int res = 0;
        unordered_map<int,vector<int>> m;
        for(int i=0;i<nums.size();i++)
            m[nums[i]].push_back(i);
        for(auto &[_,arr]:m){
            int n = arr.size(); //尝试进行连接
            int cur = 0; //当前等值子数组长度
            queue<pair<int,int>> q;//反悔队列
            int tricks = k;
            int pre = arr[0]-1;
            int loss = 0;//被舍弃掉的
            for(auto idx:arr){
                int interval = idx - pre - 1;
                if(interval==0)  cur++;////连续的相同元素
                else if(interval<=tricks){//通过删除进行连接
                    tricks-=interval;
                    q.push({interval,cur});//存储反悔可以获得的tricks,和失去的数
                    cur++;
                }
                else if(interval<=k){//可以通过反悔连接
                    while(interval>tricks){
                        tricks+=q.front().first;
                        loss = q.front().second; //更新丢失的数
                        q.pop();//删除
                    }
                    tricks-=interval;
                    q.push({interval,cur});//存储反悔可以获得的tricks,和失去的数
                    cur++;
                }
                else{//重新开辟
                    cur = 1;
                    loss = 0;
                    q = queue<pair<int,int>>();
                    tricks = k;
                }
                pre = idx;
                res = max(res,cur-loss);
            }
        }
        return res;
    }
};

2. 哈希分组 + 预处理 + 双指针

用双指针代替反悔队列,使用vector会比哈希更快,同时将相邻的归为一组

class Solution {
public:
    int longestEqualSubarray(vector<int> &nums, int k) {
        int n = nums.size(), ans = 0;
        vector<vector<int>> pos(n + 1);
        for (int i = 0; i < n; i++)
            pos[nums[i]].push_back(i - pos[nums[i]].size());
        for (auto &ps: pos) {
            int left = 0;
            for (int right = 0; right < ps.size(); right++) {
                while (ps[right] - ps[left] > k) // 要删除的数太多了
                    left++;
                ans = max(ans, right - left + 1);
            }
        }
        return ans;
    }
};

标签:找出,right,等值,nums,int,tricks,++,数组,cur
From: https://www.cnblogs.com/929code/p/17644327.html

相关文章

  • shell脚本中的函数与数组
    一.函数编写脚本时,有些脚本可以反复使用,可以调用函数来解决语句块定义成函数约等于别名函数使用方法:定义函数再引用函数建立函数,基本格式1.function函数名{ 命令序列}2.函数名(){命令序列}3.functionfunc_name(){...函数体...}1.注意事项直接写......
  • C++ Vector数组优化
    Vector数组优化问题这是一段没有优化的代码:#include<iostream>#include<vector>classEntity{public: intx,y;public: Entity(intx,inty) :x(x),y(y){} Entity(constEntity&e) :x(e.x),y(e.y){ std::cout<<"Copied!"<<st......
  • MyBatis中动态SQL判断等值的方式
    一般情况下在使用mybatis的动态SQL时,常用的是用来判空,如下:<iftest="userType!=nullanduserType!=''"><![CDATA[anduser_type=#{userType}]]></if>有时会遇到判断条件是某一个值的时候执行特殊的sql条件或语句,如下:1.数值型示例如下:<iftest="us......
  • 1.8.21二维数组右上左下遍历
    1.题目描述给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺序遍历整个数组。输入输入的第一行上有两个整数,依次为row和col。余下有row行,每行包含col个整数,构成一个二维整数数组。(注:输入的row和col保证0<row<100,0<col<100)输......
  • 力扣-4-寻找两个正序数组的中位数
    题目要求O(log(m+n))的时间复杂度知道了两个数组的长度,那么中位数的下标以及如何计算是可以确定的,给出的是两个正序数组,如果使用双指针,从两个数组头开始扫描并比较,找出合并后第K小的数字,时间复杂度是多少?时间复杂度是O((M+N)/2),这个目标还不及题目的要求,看到logN就会想到二分......
  • 列表与数组
    目录数组列表..范围操作符qw简写列表的赋值@字符pop和push操作符shift和unshift列表指的是标量的有序集合,而数组则是存储列表的变量数组假如你对索引值超过数组尾端的元素进行赋值,数组将会根据需要自动扩大——只要有可用的内存分配给Perl,数组的长度是没有上限的。如果在扩展......
  • 数组
    数组我们可以使用数组来保存同一个数据类型的多个数据数组的特点1.数组的长度一旦确定就不能改变 1.一个数组中元素的数据类型都是一样的数组的初始化动态初始化格式数据类型[]数组名=new数据类型[长度];例如:int[]array=newint[10];//动态初始化一个长度为10的数组,数组......
  • 「AWOI Round 2 C」数组操作?数组操作!
    「AWOIRound2C」数组操作?数组操作!洛谷题目描述给定两个长度为\(n\)的数组\(a,b\),将它们合并得到一个长度为\(2\timesn\)的数组\(c\)。设\(a\)数组第\(i\)个元素合并后位于\(c\)数组第\(lb_i\)个位置,\(b\)数组第\(i\)个元素合并后位于\(c\)数组第\(......
  • 线段树与树状数组
    $$\texttt{线段树}$$OI-wikiLink线段树是一种用于维护区间信息的数据结构,可以在\(O(\logn)\)的复杂度下求出一个大小为\(n\)的数组的区间信息(如区间和、区间最大值等),也可以在同样时间复杂度下实现单点修改和区间修改等操作。基本结构:......
  • 代码随想录算法训练营第六天|242.有效的字母异位词 349. 两个数组的交集 202. 快乐数
     哈希表部分:哈希表,简单来说就是k-v形式查询的结构,用来快速判断一个元素是否出现集合里,如hashmap核心是哈希函数,k存哈希函数的值,找的时候找查询项的哈希函数值就行,返回v 出现哈希碰撞的时候,查找的流程怎么走呢?(*存疑,之后查一下) 类型:数组+集合set(set、multiset、unordered......