写点什么

2022-09-11:arr 是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”, 并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。 我们最多能将数组分成

  • 2022 年 9 月 11 日
    北京
  • 本文字数:838 字

    阅读完需:约 3 分钟

2022-09-11:arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”, 并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。 我们最多能将数组分成

2022-09-11: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] 可以得到最多的块数。


答案 2022-09-11:


i 右边的最小值小于 max[0~i],不能分割;大于等于 max[0~i],可以分割。时间复杂度:O(N)。空间复杂度:O(N)。


代码用 rust 编写。代码如下:


fn main() {    let mut arr = vec![2, 1, 3, 4, 4];    let ans = max_chunks_to_sorted(&mut arr);    println!("ans = {}", ans);}
fn max_chunks_to_sorted(arr: &mut Vec<i32>) -> i32 { let n = arr.len() as i32; let mut mins: Vec<i32> = vec![]; for _ in 0..n { mins.push(0); } // i ~ 最后位置上,最小值! // 5 | 6... // 17 | 18... mins[(n - 1) as usize] = arr[(n - 1) as usize]; let mut i = n - 2; while i >= 0 { mins[i as usize] = get_min(arr[i as usize], mins[(i + 1) as usize]); i -= 1; } let mut ans = 1; let mut max = arr[0]; for i in 1..n { if max <= mins[i as usize] { ans += 1; } max = get_max(max, arr[i as usize]); } return ans;}
fn get_max<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T { if a > b { a } else { b }}
fn get_min<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T { if a < b { a } else { b }}
复制代码


结果如下:





左神java代码

发布于: 刚刚阅读数: 4
用户头像

还未添加个人签名 2021.02.15 加入

还未添加个人简介

评论

发布
暂无评论
2022-09-11:arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”, 并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。 我们最多能将数组分成_算法_福大大架构师每日一题_InfoQ写作社区