当前位置: 首页 > news >正文

LeetCode 2831.找出最长等值子数组(cpp, python3)

题目链接:2831.找出最长等值子数组

> 将元素值为下标索引,将元素在数组nums中的出现位置记录在二维数组position中,position每个下标对应的数组都是下标索引在nums中的出现位置

> 记position的下标为index,index在nums中的出现次数为position[index].size(),记作cnt1,而在nums数组中index第一次出现到最后一次出现,这个范围内nums的元素个数为:position[index][position[index].size() - 1] - position[index][0] + 1,记作cnt2,那么cnt2 - cnt1就等于需要删除的元素的个数,删除之后最长等值数组的长度就等于滑动窗口的right - left + 1

cpp实现:

class Solution {
public:int longestEqualSubarray(vector<int>& nums, int k) {int ans = 0; // 初始化长度为0vector<vector<int>> position(nums.size() + 1); //定义nums中元素出现的下标数组for (int i = 0; i < nums.size(); i++) {position[nums[i]].push_back(i); }for (auto& e : position) { //分别遍历每一个元素所对应的下标int left = 0; //滑动窗口初始化左端点为0for (int right = 0; right < e.size(); right++) { //不断移动右端点while (e[right] - e[left] + 1 - (right - left + 1) > k) { //当需要移除的元素个数大于k时left += 1; //收缩窗口}ans = max(ans, right - left + 1); //退出循环之后,说明满足条件,更新ans}}return ans;}
};

python3实现:

class Solution:def longestEqualSubarray(self, nums: List[int], k: int) -> int:ans = 0position = [[] for _ in range(len(nums) + 1)]for i, x in enumerate(nums):position[x].append(i)for e in position:left = 0for right in range(len(e)):while e[right] - e[left] + 1 - (right - left + 1) > k:left += 1ans = max(ans, right - left + 1)return ans


http://www.mrgr.cn/news/47128.html

相关文章:

  • Windows安装ES单机版设置密码
  • c语言-----常识问题
  • Unity的Transform类
  • 典型的 package.json 文件中的
  • 【STM32-学习笔记-9-】SPI通信
  • 数据库中全局查找表中包含某个字段
  • 深入理解 Vue.js 事件修饰符与事件冒泡:实战指南20241010
  • 基于RAMS的台风苏拉(Saola)模拟预报深入分析引言
  • tcl/perl 脚本命令学习
  • Python库pandas之五
  • 复古胶片风格人文扫街摄影后期Lr调色,手机滤镜PS+Lightroom预设下载!
  • 自动驾驶系统研发系列—全智能驾驶新高度:深入解析车道保持辅助(ELK)功能
  • ComfyUI 使用 LoRA 极简工作流
  • 关于摩托车一键启动无钥匙进入、智能科技创新
  • 2024年危化品经营单位(生产管理人员)考试题库及答案
  • 安装雷池社区版,保护网站安全
  • 无理工科背景的零基础小白如何入门AI?AI学习资料分享
  • Redis 数据类型string(字符串)
  • 各种遥控通讯方式的特点原理,优缺点
  • 餐饮连锁公司怎么做起来的,前期该如何起步?
  • 光纤---保偏光纤
  • QTableView 和 QStandardItemModel的关系
  • 会话管理:深入理解SQLAlchemy会话及其事务处理
  • 新手做独立站用哪个建站平台好呢
  • IMX6 HSD gt9xx触摸调试
  • zabbix7.0配置中文界面