【八月】 每日一题 - 768. 最多能完成排序的块 I and II

简介: 【八月】 每日一题 - 768. 最多能完成排序的块 I and II

问题

给定一个长度为 n 的整数数组 arr ,它表示在 [0, n - 1] 范围内的整数的排列。

我们将 arr 分割成若干 块 (即分区),并对每个块单独排序。将它们连接起来后,使得连接的结果和按升序排序后的原数组相同。

返回数组能分成的最多块数量。

示例 1:

输入: arr = [4,3,2,1,0]
输出: 1
解释:
将数组分成2块或者更多块,都无法得到所需的结果。
例如,分成 [4, 3], [2, 1, 0] 的结果是 [3, 4, 0, 1, 2],这不是有序的数组。

示例 2:

输入: arr = [1,0,2,3,4]
输出: 4

解释:

我们可以把它分成两块,例如 [1, 0], [2, 3, 4]。 然而,分成 [1, 0], [2], [3], [4] 可以得到最多的块数。 提示:

  • n == arr.length
  • 1 <= n <= 10
  • 0 <= arr[i] < n
  • arr 中每个元素都 不同

链接:leetcode.cn/problems/ma…

AC思路

迭代整个列表,因为 arr ,它表示在 [0, n - 1] 范围内的整数的排列。元素小于之前最大的元素就不得不融为一体,成为一个块。(因为比当前元素大,在排序后一定会出现在改元素后面),当第 i 个元素大于 前 i - 1 个元素中最大的元素的时候,说明其本身在前 i 个元素中是最靠后的,能独立称为一个块。

[1,0,2,3,4]   [4,3,2,1,0]
[0,1,2,3,4]   [0,1,2,3,4]

代码

var maxChunksToSorted = function(arr) {
    let count = 0
    let max = 0
    for(let i = 0; i < arr.length; i++){
        max = Math.max(max,arr[i])
        if(max === i) count ++
    }
    return count
};

最多能完成排序的块 II

问题

image.png

链接:leetcode.cn/problems/ma…

AC思路

[1,2,3,4,5] 可以分为 5 个块,而[2,1,3,4,5]最多分为 4 个块,观察题意我们可以发现只要当前元素小于之前元素的最大值,就不得不和它们玩在一起。(拼成一个块)

例如[4,2,1,5]遍历到元素 2 的时候,就只能和 4 这个家伙混在一起,当遍历到 1 当时候,就只能和 4 2这两个家伙玩在一起拼成一个块,而遍历到 5 的时候 ,5是目前为止最大的,所以它可以一个人玩(一个独立的块)。

但是[3,6,7,4]这种情况就是 6 7 得和 4 拼成一个快,但是和上题不同的是,本题内元素可以重复,所以排序后的结果无法用下标来对应。但是单调栈可以很好的帮助我们解决问题

  • 那为什么要使用单调栈呢 ? 原因也很简单,迭代元素的时候发现大于之前最大的,就能独立成为一个块,使用单调递增栈能帮助我们维护所有的块以及每个块最大的元素。 比如[1,0] 实际上我们只需要记录 1 即可,后面只需要比 1 大那么它就是一个独立的块,如果这块不太清楚还是直接看代码好理解一点。

AC代码

var maxChunksToSorted = function(arr) {
    const stack = [] // 递增栈
    for(let i = 0; i < arr.length; i++){
        // 第一个元素进来没人比较自己成为一个块,后面的元素比栈顶大就是独立的元素
        if(stack.length === 0 || arr[i] >= stack[stack.length - 1]){
            stack.push(arr[i])
        }else{
            // [1,2,0] 当迭代到 0 的时候,不断弹出栈中的元素,保证 0 能融入其中。记录这个块中的最大值。
            let max = stack.pop()
            while(stack.length && stack[stack.length - 1] > arr[i]){
                stack.pop()
            }
            stack.push(max)
        }
    }
    return stack.length
};


相关文章
|
8月前
|
人工智能 运维 Prometheus
别只盯着监控图了,大模型才是服务质量的新保镖!
别只盯着监控图了,大模型才是服务质量的新保镖!
243 13
|
10月前
|
机器学习/深度学习 人工智能 算法
Stable Virtual Camera:2D秒变3D电影!Stability AI黑科技解锁无限运镜,自定义轨迹一键生成
Stable Virtual Camera 是 Stability AI 推出的 AI 模型,能够将 2D 图像转换为具有真实深度和透视感的 3D 视频,支持自定义相机轨迹和多种动态路径,生成高质量且时间平滑的视频。
725 0
Stable Virtual Camera:2D秒变3D电影!Stability AI黑科技解锁无限运镜,自定义轨迹一键生成
ORA-08002: 序列 SEQ_GX.CURRVAL 尚未在此会话中定义
ORA-08002: 序列 SEQ_GX.CURRVAL 尚未在此会话中定义 这是因为在一个新的会话中,序列需要初始化,也就是通过.NEXTVAL来完成序列的初始化。
2331 0
|
10月前
|
人工智能 搜索推荐 Java
Spring AI与DeepSeek实战三:打造企业知识库
本文基于Spring AI与RAG技术结合,通过构建实时知识库增强大语言模型能力,实现企业级智能搜索场景与个性化推荐,攻克LLM知识滞后与生成幻觉两大核心痛点。
1190 7
|
开发框架 .NET API
RESTful API 设计与实现:C# 开发者的一分钟入门
【10月更文挑战第5天】本文从零开始,介绍了如何使用 C# 和 ASP.NET Core 设计并实现一个简单的 RESTful API。首先解释了 RESTful API 的概念及其核心原则,然后详细说明了设计 RESTful API 的关键步骤,包括资源识别、URI 设计、HTTP 方法选择、状态码使用和错误处理。最后,通过一个用户管理 API 的示例,演示了如何创建项目、定义模型、实现控制器及运行测试,帮助读者掌握 RESTful API 的开发技巧。
656 7
|
11月前
|
人工智能 自然语言处理 运维
AI性能极致体验:通过阿里云平台高效调用满血版DeepSeek-R1模型
DeepSeek是近期热门的开源大语言模型(LLM),以其强大的训练和推理能力备受关注。然而,随着用户需求的增长,其官网在高并发和大数据处理场景下常面临服务不稳定的问题。本文将深度测评通过阿里云平台调用满血版DeepSeek模型(671B),以充分发挥其性能和稳定性。阿里云提供高效、低延迟、大规模并发支持及稳定的云服务保障,并为用户提供100万免费token,简化操作流程,确保企业在AI应用上的高效性和成本效益。尽管如此,DeepSeek API目前不支持联网搜索和图片、文档分析功能,需结合其他工具实现。
1638 17
|
机器学习/深度学习 自然语言处理 语音技术
RNN是什么?哪些地方应用的多?
【10月更文挑战第8天】RNN是什么?哪些地方应用的多?
991 0
|
监控 Java 数据库
Spring事务中的@Transactional注解剖析
通过上述分析,可以看到 `@Transactional`注解在Spring框架中扮演着关键角色,它简化了事务管理的复杂度,让开发者能够更加专注于业务逻辑本身。合理运用并理解其背后的机制,对于构建稳定、高效的Java企业应用至关重要。
522 0
|
监控 小程序 Java
《优化接口设计的思路》系列:第五篇—接口发生异常如何统一处理
大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
1077 0
《优化接口设计的思路》系列:第五篇—接口发生异常如何统一处理
|
Ubuntu 安全 Linux
在Ubuntu 20.04上安装和配置VNC的方法
在Ubuntu 20.04上安装和配置VNC的方法
1929 0

热门文章

最新文章