【LeetCode】768. 最多能完成排序的块 II

这篇具有很好参考价值的文章主要介绍了【LeetCode】768. 最多能完成排序的块 II。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

768. 最多能完成排序的块 II(困难)

【LeetCode】768. 最多能完成排序的块 II
【LeetCode】768. 最多能完成排序的块 II
【LeetCode】768. 最多能完成排序的块 II

思路

  • 对于已经分好块的数组,若块数大于 1,则可以得到以下结论:「 右边的块的所有数字均大于或等于左边的块的所有数字」。考虑这个问题:对于已经分好块的数组,若在其末尾添加一个数字,如何求得新数组的分块方式?
  • 新添加的数字可能会改变原数组的分块方式
    • 如果新添加的数字大于或等于原数组最后一个块的最大值,则这个新添加的数字可以自己形成一个块
    • 如果新添加的数字小于原数组最后一个块的最大值,则它必须融入最后一个块
    • 如果它大于或等于原数组倒数第二个块 (如果有)的最大值,那么这个过程可以停止,新数组的分块方式已经求得。否则,它将继续融合原数组倒数第二个块,直到遇到一个块,使得该块的最大值小于或等于这个新添加的数,或者这个数字已经融合了所有块
  • 上述分析过程中,我们只用到了块的最大值来进行比较,比较过程又是从右到左,符合栈的思想,因此可以用类似单调栈的数据结构来存储块的最大值。

【LeetCode】768. 最多能完成排序的块 II文章来源地址https://www.toymoban.com/news/detail-477021.html

代码

class Solution {
public:
    int maxChunksToSorted(vector<int>& arr) {
        stack<int> st;
        for(int i=0; i<arr.size(); ++i){
            if(st.empty() || arr[i] >= st.top()){
                st.push(arr[i]);
            }
            else if(!st.empty() && arr[i]< st.top()){
                int head = st.top();
                st.pop();
                while(!st.empty() && arr[i] < st.top()){
                    st.pop();
                }
                st.push(head);
            }
        }
        return st.size();
    }
};

到了这里,关于【LeetCode】768. 最多能完成排序的块 II的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【LeetCode困难】1263. 推箱子

    「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓库中的目标位置。 游戏地图用大小为 m x n 的网格 grid 表示,其中每个元素可以是墙、地板或者是箱子。 现在你将作为玩家参与游戏,按规则将箱子 ‘B’ 移动到目标位置 ‘T’ : 玩家用字符 ‘S’ 表示,只要

    2024年02月04日
    浏览(30)
  • 【动态规划】Leetcode 32. 最长有效括号【困难】

    给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。 示例 2: 输入 :s = “)()())” 输出 :4 解释 :最长有效括号子串是 “()()” 1、使用动态规划求解,定义一个一维数组dp,其中dp[i]表示以第i个字符结尾的最长有效括号子串的长度

    2024年04月27日
    浏览(40)
  • Leetcode—23.合并 K 个升序链表【困难】

    用容量为K的最小堆优先队列,把链表的头结点都放进去,然后出队当前优先队列中最小的,挂上链表,,然后让出队的那个节点的下一个入队,再出队当前优先队列中最小的,直到优先队列为空。 之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,

    2024年01月25日
    浏览(62)
  • 每天一道leetcode:127. 单词接龙(图论&困难&建图&广度优先遍历)

    字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord - s1 - s2 - ... - sk : 每一对相邻的单词只差一个字母。 对于 1 = i = k 时,每个 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。 sk == endWord 给你两个单词 beginWord 和 endWord 和一个字典

    2024年02月12日
    浏览(36)
  • LeetCode_原地哈希_困难_41.缺失的第一个正数

    给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1: 输入:nums = [1,2,0] 输出:3 示例 2: 输入:nums = [3,4,-1,1] 输出:2 示例 3: 输入:nums = [7,8,9,11,12] 输出:1 提示: 1 = nu

    2024年02月03日
    浏览(42)
  • 每天一道leetcode:1192. 查找集群内的关键连接(图论&困难&tarjan算法)

    力扣数据中心有 n 台服务器,分别按从 0 到 n-1 的方式进行了编号。它们之间以 服务器到服务器 的形式相互连接组成了一个内部集群,连接是无向的。用 connections 表示集群网络, connections[i] = [a, b] 表示服务器 a 和 b 之间形成连接。任何服务器都可以直接或者间接地通过网络

    2024年02月12日
    浏览(50)
  • LeetCode_DFS_困难_1377.T 秒后青蛙的位置

    给你一棵由 n 个顶点组成的无向树,顶点编号从 1 到 n。青蛙从 顶点 1 开始起跳。规则如下: 在一秒内,青蛙从它所在的当前顶点跳到另一个未访问过的顶点(如果它们直接相连)。 青蛙无法跳回已经访问过的顶点。 如果青蛙可以跳到多个不同顶点,那么它跳到其中任意一

    2024年02月06日
    浏览(26)
  • LeetCode 2569. Handling Sum Queries After Update【数组,线段树】困难

    本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,

    2024年02月15日
    浏览(36)
  • LeetCode 1000. Minimum Cost to Merge Stones【记忆化搜索,动态规划,数组】困难

    本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,

    2023年04月26日
    浏览(103)
  • 算法导论笔记:桶排序 线性时间完成

    P112 8.4桶排序 总能线性时间完成 桶排序概念: 桶排序(Bucket Sort)又称箱排序,是一种比较常用的排序算法。其算法原理是将数组分到有限数量的桶里,再对每个桶分别排好序(可以是递归使用桶排序,也可以是使用其他排序算法将每个桶分别排好序),最后一次将每个桶中

    2024年02月07日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包