每日一练 2024.5.16(补 2024.5.14)

news2025/1/20 5:06:17
题目;

我们定义 arr 是 山形数组 当且仅当它满足:

  • arr.length >= 3
  • 存在某个下标 i (从 0 开始) 满足 0 < i < arr.length - 1 且:
    • arr[0] < arr[1] < ... < arr[i - 1] < arr[i]
    • arr[i] > arr[i + 1] > ... > arr[arr.length - 1]

给你整数数组 nums​ ,请你返回将 nums 变成 山形状数组 的​ 最少 删除次数。

示例 1:

输入:nums = [1,3,1]
输出:0
解释:数组本身就是山形数组,所以我们不需要删除任何元素。

示例 2:

输入:nums = [2,1,1,5,6,2,3,1]
输出:3
解释:一种方法是将下标为 0,1 和 5 的元素删除,剩余元素为 [1,5,6,3,1] ,是山形数组。

提示:

  • 3 <= nums.length <= 1000
  • 1 <= nums[i] <= 109
  • 题目保证 nums 删除一些元素后一定能得到山形数组。
解题:
  1. 解决这个问题的关键在于理解如何利用动态规划(DP)来找到任意一个元素作为山顶时的最长山形子序列。这一过程可以分解为几个步骤:

  2. 定义状态

    • 我们维护两个DP数组来记录状态,即lis[i]lds[i]
      • lis[i]代表以nums[i]结尾的最长上升子序列的长度(Longest Increasing Subsequence, LIS)。
      • lds[i]代表从nums[i]开始的最长下降子序列的长度(Longest Decreasing Subsequence, LDS)。
  3. 状态转移

    • 对于lis[i],我们通过比较nums[i]与其之前的元素nums[j]j < i)来更新lis[i]的值。
    • 对于lds[i],我们通过比较nums[i]与其之后的元素nums[j]j > i)来更新lds[i]的值。
  4. 合并上升和下降序列

    • 一旦我们有了每个元素为山顶时的上升和下降序列长度,我们就可以找到以该元素为山顶时的最长山形序列的长度,即lis[i] + lds[i] - 1(因为山顶元素被计算了两次,需减去1)。
  5. 找到最长的山形子序列

    • 遍历所有元素,利用上述方法计算以每个元素为山顶的最长山形序列长度,取最大值maxLength
  6. 计算最小删除次数

    • 最后,用数组总长减去maxLength,即得到了得到山形数组的最少删除次数。

计算LIS:

for (int i = 0; i < n; i++) {
    lis[i] = 1;
    for (int j = 0; j < i; j++) {
        if (nums[i] > nums[j]) {
            lis[i] = Math.max(lis[i], lis[j] + 1);
        }
    }
}

计算LDS:

for (int i = n - 1; i >= 0; i--) {
    lds[i] = 1;
    for (int j = n - 1; j > i; j--) {
        if (nums[i] > nums[j]) {
            lds[i] = Math.max(lds[i], lds[j] + 1);
        }
    }
}

找出最长的山形子序列并计算需要删除的元素数量:

int maxLength = 0;
for (int i = 0; i < n; i++) {
    if (lis[i] > 1 && lds[i] > 1) {
        maxLength = Math.max(maxLength, lis[i] + lds[i] - 1);
    }
}
return n - maxLength;
代码:
public class Solution {
    public int minimumMountainRemovals(int[] nums) {
        int n = nums.length;
        int[] lis = new int[n];
        int[] lds = new int[n];

        // 计算 LIS
        for (int i = 0; i < n; i++) {
            lis[i] = 1;
            for (int j = 0; j < i; j++) {
                if (nums[i] > nums[j]) {
                    lis[i] = Math.max(lis[i], lis[j] + 1);
                }
            }
        }

        // 计算 LDS
        for (int i = n - 1; i >= 0; i--) {
            lds[i] = 1;
            for (int j = n - 1; j > i; j--) {
                if (nums[i] > nums[j]) {
                    lds[i] = Math.max(lds[i], lds[j] + 1);
                }
            }
        }

        // 找出最长的山形子序列
        int maxLength = 0;
        for (int i = 0; i < n; i++) {
            if (lis[i] > 1 && lds[i] > 1) {
                maxLength = Math.max(maxLength, lis[i] + lds[i] - 1);
            }
        }

        // 返回需要删除的元素数量
        return n - maxLength;
    }
}
知识点解析:
  1. 动态规划(Dynamic Programming, DP):利用过去计算的结果来帮助解决后续的子问题,从而避免重复计算。这是解题的核心思想,通过分别计算最长上升子序列(LIS)和最长下降子序列(LDS)来找到最长的山形子序列。

  2. 数组操作:利用数组存储中间计算结果(如LIS和LDS的长度),以及最终的结果计算。

  3. 双层循环:用于计算LIS和LDS,内层循环遍历小于当前索引的所有元素,寻找合适的元素更新当前的LIS或LDS值。

  4. 条件判断:在计算LIS和LDS时,需要通过条件判断来确保只有在当前元素大于遍历到的元素时才进行计算。

  5. 数学运算:在各个步骤中用到了基本的数学运算,如最大值Math.max()的计算。

知识点描述应用
动态规划通过解决子问题的方式来解决主问题,避免重复计算。分别计算最长上升子序列(LIS)和最长下降子序列(LDS)。
数组操作使用数组来存储数据和结果。存储LIS和LDS的长度及用于遍历查找的过程中的中间结果。
双层循环使用嵌套循环遍历数组中的元素。在计算LIS和LDS时,内层循环遍历并更新当前索引的LIS或LDS值。
条件判断根据特定条件来执行不同的逻辑。确保在适当的条件下(如要求严格递增/递减)更新LIS和LDS值。
数学运算使用基本的数学运算和函数。使用Math.max()来找到最大的LIS、LDS值,以及计

2024.5.14

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

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

相关文章

泛微E9开发 自动获取日期

选择开始日期&#xff0c;自动获取指定天数后的结束日期 1、功能背景2、展示效果3、实现方法 1、功能背景 用户选择开始日期&#xff0c;系统自动带出结束日期&#xff0c;如需要带出6天后的结束日期&#xff0c;下图所示&#xff0c;5月14日到5月20日是一个周期&#xff0c;用…

Linux-centos下安装ffmpeg的详细教程

源安装 第一种方式&#xff1a; . 首先需要安装yum源&#xff1a; 这个源安装的ffmpeg版本是3.4 yum install epel-release yum install -y https://mirrors.ustc.edu.cn/rpmfusion/free/el/rpmfusion-free-release-7.noarch.rpm然后可以安装ffmpeg yum install -y ffmpeg ff…

电阻式传感器

电阻式传感器是一种将非电学量&#xff08;如温度、压力、位移等&#xff09;转换为电阻变化的传感器。它大致分为电阻应变式传感器、压阻式传感器和变阻式传感器三类。 电阻式传感器的优点包括结构简单、成本低廉、稳定性好&#xff0c;适用于多种环境。但它们也有局限性&…

第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组 AB路线

//bfs 1000100010不会超时 #include<bits/stdc.h> using namespace std; #define int long long const int n1e311; int a,b,c,h[n][n][12],k[4][2]{0,1,0,-1,1,0,-1,0}; char t[n][n]; struct s {int x,y,z,w; }; signed main() {ios::sync_with_stdio(false);cin.t…

VMware虚拟机-安装程序无法自动安装virtual machine......_windows server 2008 R2

系统版本&#xff1a;windows server 2008 R2 问题-安装程序无法自动安装virtual machine… 在使用虚拟机安装windows server 2008 R2系统中&#xff0c;安装VMware Tools工具安祖啊寄给你失败&#xff0c;提示安装程序无法自动安装virtual machine…&#xff0c;必须手动安装…

lazada、shopee新店铺如何快速出单?自养号补单测评实战操作指南

作为一家Lazada、虾皮新店铺&#xff0c;要快速出单&#xff0c;需要采取一些策略和措施。以下是一些可以考虑的方法&#xff1a; 一、优化产品信息 确保您的产品信息完整、准确、清晰&#xff0c;并且可以吸引潜在客户。这包括商品标题、描述、图片、价格等。 二、优化店铺…

其他自动化工程师都在偷偷学习AI技术,你再不学就落后了!一篇文章教会你使用AI!

其他自动化工程师都在偷偷学习AI技术&#xff0c;你再不学就落后了&#xff01;一篇文章教会你使用AI&#xff01; 哈喽&#xff0c;大家好&#xff0c;我是小叔。了解小叔的朋友都清楚&#xff0c;我从来都不是标题党&#xff0c;我只会用美女图片来吸引你们&#x1f602;&am…

如何管理研发人员

在日益激烈的市场竞争中&#xff0c;企业的核心竞争力往往取决于其技术创新能力和研发实力。然而&#xff0c;随着企业研发的深入和技术的积累&#xff0c;研发人员泄密的风险也愈发严重。如何防止研发人员泄密&#xff0c;已经成为企业面临的重要问题。本文将从加强员工保密意…

前端简史之崛起:Router迁鼎

引 &#x1f4a1; Ajax 的出现&#xff0c;带来了 jQuery 时代&#xff1b;Node技术的发展&#xff0c;带来了前端工程化进阶&#xff1b;如果说前面二者是带来技术的革命&#xff0c;那么前端路由方案的多样化则带来了用户体验的升级以及项目管理的优化。 课程简介 《前端简史…

AI for Good | 我们用“AI”保护地球

4月&#xff0c;草长莺飞的春夏之交&#xff0c;我们将迎来第55个世界地球日 (The World Earth Day)。在这个不断变暖的星球上&#xff0c;我们面临着一个巨大的挑战&#xff1a;气候变化。随着极端天气事件的频发&#xff0c;如何汇聚社会各界的共同努力&#xff0c;找到创新的…

【网站项目】SpringBoot379儿童疫苗接种管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

ubuntu虚拟机的 网卡不见了?

通过 ifconfig 命令查找不到自己的虚拟机上网网卡了,虚拟机的上网网卡名字是ens33 发现只有一个本地回环地址 执行如下两条指令可恢复网卡 sudo dhclient ens33#获取ip sudo ifconfig ens33#查看ip 再次通过ifconfig查看网卡信息

对话YashanDB CTO陈志标:如何推动国产数据库长远发展

深圳计算科学研究院&#xff08;以下简称“深算院”&#xff09;是深圳市人民政府2018年11月批准建设的“十大基础研究机构”之一&#xff0c;由深圳市科技创新委员会主管、深圳大学举办、深圳市龙华区人民政府共建的二类事业法人单位。 崖山数据库系统YashanDB是深算院完全自主…

券商龙头借助 PowerAgent 实现大模型落地成本与效率平衡

2022 年 ChatGPT 的诞生被看作是 AI 大模型技术的“iPhone 时刻”&#xff0c;也象征着 AI 普惠时代的真正到来。大模型持续引领全球 AI 大模型技术突飞猛进&#xff0c;特别是中国的 AI 市场。 2023 年&#xff0c;我国 AI 领域“百模大战”的硝烟还未完全消散&#xff0c;20…

金蝶AAS-V9.0前后端部署

前言 包含金蝶AAS9.0部署&#xff0c;前端部署&#xff0c;后端部署。 金蝶AAS9.0部署 1. 下载金蝶AAS9.0安装包上传至服务器&#xff1b; 2. 解压安装包&#xff1b; unzip -d /opt/AAS-V9.0 AAS-V9.0.zip3. 配置JAVA路径&#xff1b; echo $JAVA_HOME vim /opt/AAS-9.0…

二三维战场仿真系统

收费工具&#xff0c;白嫖党勿扰 收费金额1万元 1 概述 给某个公司做了一个战场仿真系统&#xff0c;该公司给了5W的辛苦费。现在把相关功能部分提取出来&#xff0c;给需要的同学。 2 功能说明 战场仿真系统&#xff0c;分为三个部分&#xff1a; 服务器&#xff0c;用来发…

太平洋产险海南分公司提醒您:高温来袭!新能源车该如何正确充电?

据不完全统计 近三年来 7-8月一直是电动汽车烧车事故的高发期 毕竟夏季的高温影响着动力电池的状态新能源汽车为什么会自燃&#xff1f; 小保替你们找到了央视的官方回答&#xff01; 原来 新能源汽车比传统燃油车多了一套电池系统 电解液为可燃物 当热量聚集达到燃点却没…

第三十二天 | 46.全排列 47.全排列||

终于进入排列&#xff01;&#xff08;之前都是组合&#xff09; 排列和组合的区别&#xff1a;在数学上的区别都懂&#xff0c;主要是看在代码实现上有什么区别 题目&#xff1a;46.全排列 树型结构比较简单 用used标记某一元素是否使用过。在组合问题中&#xff0c;其实是…

【代码随想录】面试常考题目类型之贪心1

前言 更详细的在大佬的代码随想录 (programmercarl.com) 本系列仅是简洁版笔记&#xff0c;为了之后方便观看 本质 局部最优推出全局最优 验证 验证可不可以用贪心算法最好用的策略就是举反例&#xff0c;想不到反例就试贪心 分发饼干 455. 分发饼干 - 力扣&#xff08;…

【错题集-编程题】主持人调度(二)(贪心 + 优先级队列)

牛客对应题目链接&#xff1a;主持人调度&#xff08;二&#xff09;_牛客题霸_牛客网 (nowcoder.com) 一、分析题目 把区间按照左端点排序&#xff0c;然后搞个堆&#xff1a; 先把第⼀个区间的右端点加⼊到堆中。遍历后⾯的区间&#xff0c;分情况讨论&#xff1a;&#xff…