Leetcode 第 124 场双周赛 Problem D 修改数组后最大化数组中的连续元素数目(Java + 模拟(分段/区间))

文章目录

  • 题目
  • 思路
    • Java + 模拟(分段/区间)
    • 第 1 步:
    • 第 2 步:
    • 第 3 步:
  • 复杂度
  • Code

题目

  • Problem: 100205. 修改数组后最大化数组中的连续元素数目
  • 给你一个下标从 0 开始只包含 正 整数的数组 nums 。
  • 一开始,你可以将数组中 任意数量 元素增加 至多 1 。
  • 修改后,你可以从最终数组中选择 一个或者更多 元素,并确保这些元素升序排序后是 连续 的。比方说,[3, 4, 5] 是连续的,但是 [3, 4, 6] 和 [1, 1, 2, 3] 不是连续的。
  • 请你返回 最多 可以选出的元素数目。
  • 1 <= nums.length <= 10 ^ 5
  • 1 <= nums[i] <= 10 ^ 6

思路

Java + 模拟(分段/区间)

第 1 步:

  • 特判只有一位结果为 1,
  • 结果与 nums 顺序无关则先排序,然后将连续的段放入 TreeMap,
  • 最后顺序遍历每个连续的段,判断是否可以与前一段拼接,找到最大值

第 2 步:

  • 找连续的数字时,注意如果此段有重复数,则该段可以拓展 +1
  • 例如:1 2 2 3,可以拓展成 1 2 3 4
  • 注意记录下该段是否有过拓展

第 3 步:

  • 顺序遍历每个连续的段时,有三种情况
    • 可以与前一段拼接,因为前一段拓展了(否则就不会分成两段)
    • 比前一段大 2 且前一段未拓展,则仅前一段可以整体向后移动一位(前一段的前一段要么没有、要么拓展了才可以和前一段拼接)
    • 两段无法拼接
  • 处理三种情况,获得最大值

复杂度

时间复杂度:

时间复杂度: O ( n ∗ l o g n ) O(n*logn) O(nlogn)

空间复杂度:

空间复杂度: O ( n ) O(n) O(n)

Code

class Solution {/*** Java + 模拟(分段/区间)* 第 1 步:* 特判只有一位结果为 1,* 结果与 nums 顺序无关则先排序,然后将连续的段放入 TreeMap,* 最后顺序遍历每个连续的段,判断是否可以与前一段拼接,找到最大值* * 第 2 步:* 找连续的数字时,注意如果此段有重复数,则该段可以拓展 +1* 例如:1 2 2 3,可以拓展成 1 2 3 4* 注意记录下该段是否有过拓展* * 第 3 步:* 顺序遍历每个连续的段时,有三种情况*     * 可以与前一段拼接,因为前一段拓展了(否则就不会分成两段)*     * 比前一段大 2 且前一段未拓展,则仅前一段可以整体向后移动一位(前一段的前一段要么没有、要么拓展了才可以和前一段拼接)*     * 两段无法拼接* 处理三种情况,获得最大值* * 时间复杂度:O(n*logn),空间复杂度:O(n)* */public int maxSelectedElements(int[] nums) {int res = 0;int n = nums.length;// 特判只有一位结果为 1if (n == 1) {return 1;}// 结果与 nums 顺序无关则先排序Arrays.sort(nums);
//        System.out.println(Arrays.toString(nums));int prev = nums[0];// 该段是否有过拓展boolean countGreater1 = false;// 连续的段放入 TreeMap,记录下该段是否有过拓展(Boolean)TreeMap<Integer, Pair<Integer, Boolean>> beginEndGreater1Map = new TreeMap<>();for (int i = 1; i < n; i++) {// 此段有重复数,则该段可以拓展 +1if (nums[i] - nums[i - 1] == 0) {countGreater1 = true;} else if (nums[i] - nums[i - 1] == 1) {continue;// 此处断开,前面凑成一段,如果可拓展则断尾 +1} else {beginEndGreater1Map.put(prev, new Pair<>(nums[i - 1] + (countGreater1 ? 1 : 0), countGreater1));prev = nums[i];countGreater1 = false;}}// 注意最后一段在循环外beginEndGreater1Map.put(prev, new Pair<>(nums[n - 1] + (countGreater1 ? 1 : 0), countGreater1));
//        System.out.println(beginEndGreater1Map);prev = -100;// 到目前为止最大连续个数int continuous = 0;// 前一连续的段的值Map.Entry<Integer, Pair<Integer, Boolean>> prevEntry = null;// 顺序遍历每个连续的段,判断是否可以与前一段拼接for (Map.Entry<Integer, Pair<Integer, Boolean>> entry : beginEndGreater1Map.entrySet()) {
//            System.out.println(prevEntry);// 此段可以与前一段拼接,因为前一段拓展了(否则就不会分成两段)if (entry.getKey() - prev == 1) {continuous += entry.getValue().getKey() - entry.getKey() + 1;// 此段比前一段大 2 且前一段未拓展,则仅前一段可以整体向后移动一位(前一段的前一段要么没有、要么拓展了才可以和前一段拼接)} else if (entry.getKey() - prev == 2 && !prevEntry.getValue().getValue()) {continuous = (entry.getValue().getKey() - entry.getKey() + 1)+ (prevEntry.getValue().getKey() - prevEntry.getKey() + 1);// 两段无法拼接} else {continuous = entry.getValue().getKey() - entry.getKey() + 1;}prev = entry.getValue().getKey();prevEntry = entry;res = Math.max(continuous, res);}return res;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/689388.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django后端开发——模型层及ORM介绍

文章目录 参考资料Django配置MySQL安装mysqlclient创建数据库进入数据库的操作可能遇到的问题及解决方案Pycharm配置settings.py 模型![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c83753397bf6481d8defde26537903bf.png)ORM介绍示例终端&#xff1a;settings.py…

Linux——开发工具的使用

目录 Linux软件包管理器 yum rzsz Linux编辑器——vim vim的使用 vim的基本操作 命令模式的常见命令 底行模式的常见命令 vim是需要配置的 Linux编译器——gcc/g 预处理 编译 汇编 链接 函数库 Linux项目自动化构建工具 make/makefile make原理 项目清理 Linux调试器g…

260.【华为OD机试真题】信道分配(贪心算法-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-信道分配二.解题思路三.题解代码Python题解代码…

踩坑实录(Fourth Day)

今天开工了&#xff0c;其实还沉浸在过年放假的喜悦中……今天在自己写 Vue3 的项目&#xff0c;虽说是跟着 B 站在敲&#xff0c;但是依旧是踩了一些个坑&#xff0c;就离谱……照着敲都能踩到坑&#xff0c;我也是醉了…… 此为第四篇&#xff08;2024 年 02 月 18 日&#x…

天锐绿盾|公司办公文件数据\资料自动智能透明加密——数据防泄漏系统

天锐绿盾是一款专注于企业电脑文件数据资料透明加密的防泄密系统。它采用了先进的文件过滤驱动透明加解密技术&#xff0c;可以对企业核心部门的文档进行强制加密处理&#xff0c;确保从文档创建开始就能自动加密保护。文件的保存加密、打开解密完全由后台加解密驱动内核自动完…

React中的函数组件

import React from ./react; import ReactDOM from ./react-dom;/*** 函数组件其实是一个函数&#xff0c;接收props,返回一个React元素*/ function FunctionComponent(props){let element <h1><span>hello</span>,{props.name}</h1>;console.log(el…

2024年热门项目持续分析,趣味测试小程序项目分析以及系统功能介绍

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 趣味测试小程序是目前比较热门的娱乐测试&#xff0c;运行模式就是引导粉丝用户进去…

【《高性能 MySQL》摘录】第 3 章 服务器性能剖析

文章目录 3.1 性能优化简介3.1.1 通过性能剖析进行优化3.1.2 理解性能剖析 3.2 对应用程序进行性能剖析3.3 剖析 MySQL 查询3.3.1 剖析服务器负载捕获 MySQL 的查询到日志文件中分析查询日志 3.3.2 剖析单挑查询使用 SHOW PROFILE &#xff08;现已过时&#xff09;使用SHOW ST…

记录 | C++ cout.setf(ios::fixed)

cout.setf(ios::fixed); 是在 C 中使用的一个标准库函数&#xff0c;用于将流的输出格式设置为"fixed" "fixed"格式指定输出浮点数时&#xff0c;小数点后的位数是固定的。这意味着&#xff0c;无论输出的数字有多少位小数&#xff0c;小数点后都会保留相…

Win32 获取EXE/DLL文件版本信息

CFileVersion.h #pragma once#include <windows.h> #include <string> #include <tchar.h>#ifdef _UNICODE using _tstring std::wstring; #else using _tstring std::string; #endif// 版本号辅助类 class CVersionNumber { public:CVersionNumber() :m_…

Qt程序设计-无边框可移动可拖拽调整大小窗体

本文讲解Qt-无边框可移动可拖拽调整大小窗体。 通过鼠标的按下移动进行窗体的移动,拖拽调整窗体大小。 实现过程如下: 创建QWidget窗体,添加一个按钮控制窗体的关闭。 #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget>#include <QMouseEvent> //定…

【天衍系列 05】Flink集成KafkaSink组件:实现流式数据的可靠传输 高效协同

文章目录 01 KafkaSink 版本&导言02 KafkaSink 基本概念03 KafkaSink 工作原理1.初始化连接2.定义序列化模式3.创建KafkaSink算子4.创建数据源5.将数据流添加到KafkaSink6.内部工作机制 04 KafkaSink参数配置05 KafkaSink 应用依赖06 KafkaSink 快速入门6.1 包结构6.2 项目…

【深度学习:数据注释工具】构建与购买:从业者的经验教训

【深度学习&#xff1a;数据注释工具】构建与购买&#xff1a;从业者的经验教训 为什么数据注释团队需要标记工具&#xff1f;您的软件工程团队是否有时间/资源来构建数据注释解决方案&#xff1f;为您的项目构建数据注释工具需要多长时间&#xff1f;将开发外包给第三方会更有…

异地组网延迟怎么解决问题?

异地组网中的延迟问题可以通过SD-WAN&#xff08;Software-Defined Wide Area Network&#xff09;技术进行解决。SD-WAN可以通过优化网络流量和智能路由选择来降低延迟&#xff0c;提高应用程序的性能和用户体验。接下来将介绍使用SD-WAN解决异地组网延迟问题的常用方法。 1.…

SSH密钥认证登陆流程(Vscode连接到远程)

目录 前言连接远程步骤1. 下载工具包wsCli到本地机器2. 本地机器上生成ssh密钥3. 在服务器上安装公钥4. vscode连接到远程 参考资料 前言 SSH&#xff08;Secure Shell&#xff09;是一种用于远程登录和安全传输数据的网络协议。它提供了两种主要的远程连接方式&#xff1a; 密…

学习总结18

# 营救 ## 题目背景 “咚咚咚……”“查水表&#xff01;”原来是查水表来了&#xff0c;现在哪里找这么热心上门的查表员啊&#xff01;小明感动得热泪盈眶&#xff0c;开起了门…… ## 题目描述 妈妈下班回家&#xff0c;街坊邻居说小明被一群陌生人强行押上了警车&#…

有趣的CSS - 新拟态输入框

我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;《有趣的css》系列已更新 11 篇了&#xff0c;今天这篇是关于新拟态风格的一个输入框效果&#xff0c;希望你们喜欢。 目录 页面效果核心代码html代码css代码 完整代码html页面css样式 页面效果 此效果使用 css 中 b…

C/C++输出输出相关问题

C/C输出输出相关问题 scanf(“%d”),如果缓存区的开始是数字&#xff0c;scanf会读入&#xff0c;直到遇见非数字字符&#xff0c;否则远不会读入 #include<iostream> using namespace std; int main() {int a[100];char c[100];// scanf的返回值为“所输入的数据与格式字…

html5播放 m3u8

注意&#xff1a;m3u8地址要为网络地址&#xff0c;直接把代码复制为html直接在本地打开&#xff0c;可能不行&#xff0c;需要放在nginx或者apache或者其他的web服务器上运行。 <!DOCTYPE html> <html> <head><meta charsetutf-8 /><title>测试…

通过kafka学习数据一致性

kafka哪些环节存在数据不一致 数据复制 数据从主节点&#xff08;leader&#xff09;复制到从节点&#xff08;follower&#xff09;的过程中&#xff0c;由于网络延迟、节点故障或其他原因 可能导致从节点未能及时获取或处理主节点的数据变更&#xff0c;从而产生数据不一致…