题目 2668: 蓝桥杯2022年第十三届省赛真题-最长不下降子序列

题目 2668: 蓝桥杯2022年第十三届省赛真题-最长不下降子序列

  • 原题链接:
  • 完成情况:
  • 解题思路:
      • 代码解释
        • 主函数 `main`
        • 辅助函数 `computeLNDS`
      • 代码说明
      • 复杂度分析
      • 优化建议
  • 参考代码:
  • 错误经验吸取

原题链接:

题目 2668: 蓝桥杯2022年第十三届省赛真题-最长不下降子序列

https://www.dotcpp.com/oj/problem2668.html

完成情况:

解题思路:

代码解释

该代码旨在解决如何通过修改一个整数序列的连续 K 个数,使得修改后的序列的最长不下降子序列(LNDS)的长度最大的问题。以下是代码的详细解释:

主函数 main
public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int N = scanner.nextInt();  // 序列的长度int K = scanner.nextInt();  // 需要修改的连续子序列的长度int arrA[] = new int[N];    // 输入的整数序列for (int i = 0; i < N; i++) {arrA[i] = scanner.nextInt();}scanner.close();// 计算初始序列的最长不下降子序列长度int initLNDS = computeLNDS(arrA);int maxLNDS = initLNDS;// 遍历所有可能的连续子序列,尝试将其修改为相同值for (int i = 0; i <= N - K; i++) {int[] original = Arrays.copyOfRange(arrA, i, i + K);  // 保存原始子序列int uniqueVals[] = Arrays.stream(arrA).distinct().toArray();  // 获取序列中所有不同的值for (int value : uniqueVals) {// 将连续的 K 个数修改为当前值for (int j = i; j < i + K; j++) {arrA[j] = value;}// 计算修改后的序列的LNDS长度int modifiedLNDS = computeLNDS(arrA);maxLNDS = Math.max(maxLNDS, modifiedLNDS);}// 恢复原始子序列System.arraycopy(original, 0, arrA, i, K);}// 输出最长的LNDS长度System.out.println(maxLNDS);
}
辅助函数 computeLNDS
private static int computeLNDS(int[] array) {int[] dp_computeLNDS = new int[array.length];int length = 0;for (int num : array) {int pos = Arrays.binarySearch(dp_computeLNDS, 0, length, num);if (pos < 0) {pos = -(pos + 1);}dp_computeLNDS[pos] = num;if (pos == length) {length++;}}return length;
}

代码说明

  1. 输入读取

    • 使用 Scanner 读取输入的整数序列的长度 N 和需要修改的连续子序列的长度 K
    • 读取序列 arrA
  2. 初始 LNDS 计算

    • 通过 computeLNDS 函数计算初始序列的最长不下降子序列长度。
  3. 遍历所有可能的修改

    • 遍历所有可能的长度为 K 的连续子序列。
    • 对于每个子序列,尝试将其修改为序列中每一个不同的值。
    • 对修改后的序列,使用 computeLNDS 重新计算最长不下降子序列的长度。
    • 更新最大长度 maxLNDS
  4. 恢复原始子序列

    • 每次修改后,使用 System.arraycopy 恢复原始子序列,确保每次修改都是独立的。
  5. 输出结果

    • 最后输出最大长度 maxLNDS

复杂度分析

  • 由于需要遍历所有长度为 K 的子序列,并对每个子序列尝试所有不同的值,算法的时间复杂度较高。
  • 计算 LNDS 使用了二分查找,因此 computeLNDS 函数的时间复杂度为 O(N log N)

优化建议

  • 由于可能的输入范围较大(N <= 10^5,A[i] <= 10^6),上述算法在最坏情况下的性能可能不足以处理所有测试用例。
  • 可以考虑其他优化策略,例如利用滑动窗口等方法减少重复计算,以提升效率。

参考代码:

package leetcode板块;import java.util.Arrays;
import java.util.Scanner;public class _题目2668蓝桥杯2022年第十三届省赛真题_最长不下降子序列 {/**** @param args*/public static void main(String[] args) {// 现在你有一次机会,将其中【连续的 K 个数】 修改成 【任意一个相同值】。// 请你计算如何修改可以使修改后的数列的最长不下降子序列最长,请输出这个最长的长度。// TODO 最长不下降子序列是指序列中的一个子序列,子序列中的每个数不小于在它之前的数。/*对于所有评测用例,1 ≤ K ≤ N ≤ 10^5,1 ≤ Ai ≤ 10^6。*/Scanner scanner = new Scanner(System.in);//  长度为 N  , 将其中连续的 K 个数修改成任意一个相同值int N = scanner.nextInt();int K = scanner.nextInt();int arrA [] = new int[N];for (int i = 0; i<N;i++){arrA[i] = scanner.nextInt();}scanner.close();// 重点 :  LNDS:longest non-decreasing subsequenceint initLNDS = computeLNDS(arrA);int maxLNDS = initLNDS;// ----------------------------------------------for (int i = 0; i <= N-K;i++){int [] original = Arrays.copyOfRange(arrA,i,i+K);int uniqueVals [] = Arrays.stream(arrA).distinct().toArray();for (int value : uniqueVals){for (int j = i;j<i+K;j++){arrA[j] = value;}int modifiedLNDS = computeLNDS(arrA);maxLNDS = Math.max(maxLNDS,modifiedLNDS);}System.arraycopy(original,0,arrA,i,K);}System.out.println(maxLNDS);}/**** @param array* @return*/private static int computeLNDS(int[] array) {int [] dp_computeLNDS = new int[array.length];int length = 0;for (int num : array){int pos = Arrays.binarySearch(dp_computeLNDS,0,length,num);if (pos < 0){pos = -(pos + 1);}dp_computeLNDS[pos] = num;if (pos == length){length++;}}return length;}
}

错误经验吸取

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

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

相关文章

C++的模板(八):子系统

平常所见的大部分模板代码&#xff0c;模板所传的参数类型&#xff0c;到了模板里面&#xff0c;或实例化为对象&#xff0c;或嵌入模板内部结构中&#xff0c;或在模板内又派生了子类。不管怎样&#xff0c;最终他们在模板内&#xff0c;直接或间接&#xff0c;都实例化成对象…

常见的Java开发难题包含解决办法内存泄漏异常处理代码质量和维护

常见的Java开发难题包含解决办法内存泄漏异常处理代码质量和维护 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 I…

实践案例:使用Jetpack Navigation创建一个新闻应用

在这个实践案例中&#xff0c;我们将使用Jetpack Navigation创建一个简单的新闻应用。这个应用将包含以下功能&#xff1a; 新闻列表页面&#xff1a;显示一组新闻文章。新闻详情页面&#xff1a;显示选定新闻文章的详细信息。用户资料页面&#xff1a;显示用户的资料信息。 …

从爬取到分析:Faraday爬取Amazon音频后的数据处理

什么是Faraday&#xff1f; Faraday是一个简单、灵活的高级爬虫框架&#xff0c;支持多种编程语言。它提供了一套丰富的API&#xff0c;允许开发者快速构建复杂的爬虫应用。Faraday的主要特点包括&#xff1a; 模块化设计&#xff1a;易于扩展和自定义。多语言支持&#xff1…

Vite 动态导入警告问题解决方案

如上图我要实现从后台获取权限菜单并动态导入进行渲染 但由于 vite 暂时不支持这种导入方式 图中也给出了提示 本人也是这么去做了 但并没什么卵用 后来参考了 vite 的 import.meta.glob 这种方式 我在处理菜单权限控制的菜单里进行了如下操作&#xff1a; …

【网络架构】lvs集群

目录 一、集群与分布式 1.1 集群介绍 1.2 分布式系统 1.3 集群设计原则 二、LVS 2.1 lvs工作原理 2.2 lvs集群体系架构 ​编辑 2.3 lvs功能及组织架构 2.4 lvs集群类型中术语 三、LVS工作模式和命令 3.1 lvs集群的工作模式 3.1.1 lvs的nat模式 3.1.2 lvs的dr模式 …

从此以后,将硬件接入大语言模型(LLM)将变得如此简单~

一、前言 本文中将使用ESP-AI开源库来实现将硬件接入AI&#xff0c;整个过程将非常的轻松~ 什么是ESP-AI? 为你的开发板提供全套的AI对话方案&#xff0c;包括但不限于 ESP32 系列开发板的 IATLLMTTS 集成方案。 交流群 QQ 交流群: 854445223 技术栈 ESP-AI 分为了服务端和…

001 ElasticSearch7.x 、IK分词器、Kibana 环境搭建、安装

ElasticSearch 7.x 文章目录 ElasticSearch 7.x1.windows环境安装1.ik分词器安装2.es启动3.Kibana启动 2.Linux环境安装3.分词器1.分词测试2.ES中默认分词器3.IK分词器4.自定义分词器 1.windows环境安装 es下载地址&#xff1a; https://www.elastic.co/cn/downloads/past-rel…

超声波清洗机洗眼镜效果好吗?四大主流超声波清洗机终极大测评

清洗眼镜是日常生活中一件很麻烦的事情&#xff0c;常规的清洗方式无法完全清洁镜片上的细菌和污垢&#xff0c;而且容易造成划痕。也有很多朋友为了节省时间&#xff0c;每次清洗眼镜都用衣服衣角随便擦拭擦拭就完事了&#xff0c;但其实这样做往往会很伤眼镜&#xff0c;缩短…

矩阵新玩法,云微客AI矩阵系统开启新营销大门

在激烈的市场竞争中&#xff0c;商家企业们都在追求更加高效的营销方式&#xff0c;在如今流量至上的时代&#xff0c;短视频凭借其魅力&#xff0c;成为了众多企业吸引流量、获客引流的核心营销途径。而想要挤进短视频流量圈的你&#xff0c;是否经常听到矩阵这个词呢&#xf…

Vue3触摸屏滑动事件(touch, swipe)使用注意事项

安装npm包&#xff1a;npm i vue3-touch-events 然后在main.js里&#xff1a; import Vue3TouchEvents from "vue3-touch-events"const app createApp(App); app.use(Vue3TouchEvents); 使用方法如下&#xff0c;有些特殊的情况下需要加一个disable_touch的开关来…

远程工具的使用

远程连接工具的作用&#xff0c;通过远程连接到服务器上&#xff0c;方便操作&#xff01; 1.常见的远程连接工具 XShell&#xff1a;这是一款Windows平台下的SSH客户端软件&#xff0c;支持SSH1、SSH2、SFTP、TELNET、RLOGIN等多种协议&#xff0c;功能丰富&#xff0c;包…

【MotionCap】conda 链接缺失的cuda库

conda 安装的环境不知道为啥python 环境里的 一些cuda库是空的要自己链接过去。ln 前面是已有的,后面是要新创建的 ln -s <path to the file/folder to be linked> cuda 有安装 libcublas 已经在cuda中 (base) zhangbin@ubuntu-server:~/miniconda3/envs/ai-mocap/lib/…

智能语音新革命:有道与Azure的API服务对决

在当今技术飞速发展的时代&#xff0c;API&#xff08;应用程序接口&#xff09;已经成为连接不同软件和服务的桥梁。无论是开发移动应用、构建网页服务&#xff0c;还是实现物联网设备的互联互通&#xff0c;API都在其中扮演着不可或缺的角色。随着市场上各种API接口的涌现&am…

整数智能与上海数据交易所携手,共筑数据要素市场新篇章

近期&#xff0c;整数智能荣获上海数据交易所“数据治理服务商”证书&#xff0c;正式加入上海数据交易所数商生态&#xff0c;成为上海数据交易所官方认证的数据治理服务商。 在数字经济的浪潮中&#xff0c;上海数据交易所一直扮演着引领者和推动者的角色。紧扣建设国家级…

8大趋势,重塑金融服务行业

谈论“金融服务行业”就像谈论“亚洲大陆”。这是因为&#xff0c;通用行业概念但它掩盖了许多细分领域的细微差别和多样性&#xff0c;以及人们思考、工作和感受方式的巨大差异。 银行应用程序和一个量化交易公司都是金融服务公司&#xff0c;但它们的运营方式可能天壤之别。…

Quads,一个无敌的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个无敌的 Python 库 - Quads。 Github地址&#xff1a;https://github.com/fogleman/Quads 在科学计算和工程应用中&#xff0c;数值积分是一个常见的问题。Python的Quads库…

Python | 使用均值编码(MeanEncoding)处理分类特征

在特征工程中&#xff0c;将分类特征转换为数字特征的任务称为编码。 有多种方法来处理分类特征&#xff0c;如OneHotEncoding和LabelEncoding&#xff0c;FrequencyEncoding或通过其计数替换分类特征。同样&#xff0c;我们可以使用均值编码(MeanEncoding)。 均值编码 均值…

WiFi模块ESP8266同阿里物联网云平台连接(超详细)

写在前面&#xff1a;本节主要的内容是利用ESP8266模块&#xff0c;同阿里云物联网平台的连接&#xff0c;为后面的实现数据的远程展示与处理做好铺垫。 本节的主要内容分为一下几个阶段进行&#xff1a; 1、阿里云物联网平台的创建2、阿里云 IOT studio界面绘制3、mqtt.fx软件…

Web服务器与Apache(虚拟主机基于ip、域名和端口号)

一、Web基础 1.HTML概述 HTML&#xff08;Hypertext Markup Language&#xff09;是一种标记语音,用于创建和组织Web页面的结构和内容&#xff0c;HTML是构建Web页面的基础&#xff0c;定义了页面的结构和内容&#xff0c;通过标记和元素来实现 2.HTML文件结构 <html>…