返回介绍

solution / 0700-0799 / 0768.Max Chunks To Make Sorted II / README

发布于 2024-06-17 01:03:34 字数 3983 浏览 0 评论 0 收藏 0

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

English Version

题目描述

给你一个整数数组 arr

arr 分割成若干 ,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。

返回能将数组分成的最多块数?

 

示例 1:

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

示例 2:

输入:arr = [2,1,3,4,4]
输出:4
解释:
可以把它分成两块,例如 [2, 1], [3, 4, 4]。 
然而,分成 [2, 1], [3], [4], [4] 可以得到最多的块数。 

 

提示:

  • 1 <= arr.length <= 2000
  • 0 <= arr[i] <= 108

解法

方法一:单调栈

根据题目,我们可以发现,从左到右,每个分块都有一个最大值,并且这些分块的最大值呈单调递增(非严格递增)。我们可以用一个栈来存储这些分块的最大值。最后得到的栈的大小,也就是题目所求的最多能完成排序的块。

时间复杂度 $O(n)$,其中 $n$ 表示 $arr$ 的长度。

class Solution:
  def maxChunksToSorted(self, arr: List[int]) -> int:
    stk = []
    for v in arr:
      if not stk or v >= stk[-1]:
        stk.append(v)
      else:
        mx = stk.pop()
        while stk and stk[-1] > v:
          stk.pop()
        stk.append(mx)
    return len(stk)
class Solution {
  public int maxChunksToSorted(int[] arr) {
    Deque<Integer> stk = new ArrayDeque<>();
    for (int v : arr) {
      if (stk.isEmpty() || stk.peek() <= v) {
        stk.push(v);
      } else {
        int mx = stk.pop();
        while (!stk.isEmpty() && stk.peek() > v) {
          stk.pop();
        }
        stk.push(mx);
      }
    }
    return stk.size();
  }
}
class Solution {
public:
  int maxChunksToSorted(vector<int>& arr) {
    stack<int> stk;
    for (int& v : arr) {
      if (stk.empty() || stk.top() <= v)
        stk.push(v);
      else {
        int mx = stk.top();
        stk.pop();
        while (!stk.empty() && stk.top() > v) stk.pop();
        stk.push(mx);
      }
    }
    return stk.size();
  }
};
func maxChunksToSorted(arr []int) int {
  var stk []int
  for _, v := range arr {
    if len(stk) == 0 || stk[len(stk)-1] <= v {
      stk = append(stk, v)
    } else {
      mx := stk[len(stk)-1]
      stk = stk[:len(stk)-1]
      for len(stk) > 0 && stk[len(stk)-1] > v {
        stk = stk[:len(stk)-1]
      }
      stk = append(stk, mx)
    }
  }
  return len(stk)
}
function maxChunksToSorted(arr: number[]): number {
  const stack = [];
  for (const num of arr) {
    if (stack.length !== 0 && num < stack[stack.length - 1]) {
      const max = stack.pop();
      while (stack.length !== 0 && num < stack[stack.length - 1]) {
        stack.pop();
      }
      stack.push(max);
    } else {
      stack.push(num);
    }
  }
  return stack.length;
}
impl Solution {
  pub fn max_chunks_to_sorted(arr: Vec<i32>) -> i32 {
    let mut stack = vec![];
    for num in arr.iter() {
      if !stack.is_empty() && num < stack.last().unwrap() {
        let max = stack.pop().unwrap();
        while !stack.is_empty() && num < stack.last().unwrap() {
          stack.pop();
        }
        stack.push(max);
      } else {
        stack.push(*num);
      }
    }
    stack.len() as i32
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文