首页 > 其他分享 >图解LeetCode——769. 最多能完成排序的块(难度:中等)

图解LeetCode——769. 最多能完成排序的块(难度:中等)

时间:2023-05-23 11:02:12浏览次数:32  
标签:deque arr 769 int 最多能 item 数组 堆栈 LeetCode


一、题目

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

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

二、示例

2.1> 示例 1:

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

2.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 中每个元素都 不同

三、解题思路

3.1> 堆栈 + 对比

根据题目描述, 我们要获得最多块数量,那么对于第一种解法,我们可以采用堆栈来存储遍历后的数组元素,根据如下规则进行堆栈元素的操作:

【规则1】 如果堆栈为空,则直接入栈。
【规则2】 除了栈顶top之外,如果item指定的元素小于堆栈中的元素,则将堆栈中的那个元素“踢出”堆栈。
【规则3】 如果item指定的元素大于top元素,则将其执行入栈操作。

那么当遍历完数组arr之后,最后堆栈中保存的元素就是每个“块”中的最大值,即:堆栈中保存的元素个数就是最终结果——arr数组中最多的块数量。具体操作请见下图所示:

图解LeetCode——769. 最多能完成排序的块(难度:中等)_数组

3.2> 局部最大值 + 对比

由于题目中给了我们一个条件线索,就是:长度为 n 的整数数组 arr ,它表示在 [0, n - 1] 范围内的整数的排列,并且arr中每个元素都不同。所以,我们其实可以知道当前范围内最大值,即分别为:0、1、2、3、4、5、……那么我们通过遍历数组arr,统计遍历的数组范围内最大值max,然后让max当前范围内最大值进行对比,如果两个值相同,那么块数量加1。当遍历完整个数组之后,返回块数量即可。具体操作请见下图所示:

图解LeetCode——769. 最多能完成排序的块(难度:中等)_堆栈_02

四、代码实现

4.1> 堆栈 + 对比

class Solution {
    public int maxChunksToSorted(int[] arr) {
        Deque<Integer> deque = new ArrayDeque();
        for (int item : arr) {
            if (deque.isEmpty()) deque.addLast(item);
            if (deque.peekLast() < item) deque.addLast(item);
            else {
                int top = deque.removeLast();
                while (!deque.isEmpty()) {
                    if (deque.peekLast() < item) break;
                    deque.removeLast();
                }
                deque.addLast(top);
            }
        }
        return deque.size();
    }
}

图解LeetCode——769. 最多能完成排序的块(难度:中等)_数组_03

4.2> 局部最大值 + 对比

class Solution {
    public int maxChunksToSorted(int[] arr) {
        int result = 0, max = 0;
        // i即表达arr的下标,也表达当前范围内最大值
        for (int i = 0; i < arr.length; i ++) {
            max = Math.max(max, arr[i]);
            if (i == max) result++;
        }
        return result;
    }
}

图解LeetCode——769. 最多能完成排序的块(难度:中等)_java_04

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

标签:deque,arr,769,int,最多能,item,数组,堆栈,LeetCode
From: https://blog.51cto.com/u_15003301/6330126

相关文章

  • 图解LeetCode——940. 不同的子序列 II(难度:困难)
    一、题目给定一个字符串s,计算s的不同非空子序列的个数。因为结果可能很大,所以返回答案需要对10^9+7取余。字符串的子序列是经由原字符串删除一些(也可能不删除)字符但不改变剩余字符相对位置的一个新字符串。例如:"ace"是"abcde"的一个子序列,但"aec"不是。二、示例2.......
  • 图解LeetCode——1441. 用栈操作构建数组(难度:中等)
    一、题目给你一个数组target和一个整数n。每次迭代,需要从 list={1,2,3...,n}中依次读取一个数字。请使用下述操作来构建目标数组target:"Push":从list中读取一个新元素,并将其推入数组中。"Pop":删除数组中的最后一个元素。如果目标数组构建完成,就停止读取更多元......
  • 图解LeetCode——886. 可能的二分法(难度:中等)
    一、题目给定一组 n 人(编号为 1,2,...,n), 我们想把每个人分进任意大小的两组。每个人都可能不喜欢其他人,那么他们不应该属于同一组。给定整数n 和数组dislikes ,其中 dislikes[i]=[ai,bi] ,表示不允许将编号为ai 和  bi的人归入同一组。当可以用这种方法将所有人......
  • 图解LeetCode——827. 最大人工岛(难度:困难)
    给你一个大小为nxn二进制矩阵grid。最多只能将一格 0变成 1。返回执行此操作后,grid中最大的岛屿面积是多少?岛屿由一组上、下、左、右四个方向相连的 1形成。二、示例2.1>示例1:【输入】grid=[[1,0],[0,1]]【输出】3【解释】将一格0变成1,最终连通两个小......
  • 图解LeetCode——904. 水果成篮(难度:中等)
    一、题目你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组fruits表示,其中fruits[i]是第i棵树上的水果种类。你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:你只有两个篮子,并且每个篮子只能装单一类型的水果......
  • #yyds干货盘点# LeetCode程序员面试金典:平衡二叉树
    题目:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例1:输入:root=[3,9,20,null,null,15,7]输出:true示例2:输入:root=[1,2,2,3,3,null,null,4,4]输出:false示例3:输入:root=[]......
  • #yyds干货盘点# LeetCode程序员面试金典:分数到小数
    1.简述:给定两个整数,分别表示分数的分子 numerator和分母denominator,以字符串形式返回小数。如果小数部分为循环小数,则将循环的部分括在括号内。如果存在多个答案,只需返回任意一个。对于所有给定的输入,保证答案字符串的长度小于104。 示例1:输入:numerator=1,denominat......
  • LeetCode 103. 二叉树的锯齿形层次遍历
    classSolution{public:vector<vector<int>>res;voidbfs(TreeNode*root){queue<TreeNode*>q;q.push(root);intcnt=0;while(!q.empty()){vector<int>level;......
  • LeetCode 周赛 346(2023/05/21)仅 68 人 AK 的最短路问题
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。LeetCode单周赛第345场·体验一题多解的算法之美单周赛345概览T1.删除子串后的字符串最小长度(Easy)标签:栈T2.字典序最小回文串(Medium)标签:贪心、双指针T3.求一个整数的惩罚数(Medium)标签......
  • leetcode724
    使用数学方法:假设左边的所有数加起来的和是sum,total为数组所有元素加起来的和,当i满足中心下标的条件时,即:sum=total-sum-nums[i];2*sum+nums[i]=total;当中心下标是首位时,即左边sum为0;当中心下标是尾位时,右边total-sum-nums[i]为0;for(inti=0;i<n;++i){if(2*sum+nums[i]==......