每日力扣-分割数组

76 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情

每日力扣是一个专门用来讲力扣中国每天发布的每日一题的栏目。本专栏不提供题目的解答源码,只讲解思路,目的是养成每日刷题、提高自己手感,从而达到算法熟练的目标。

题目(已做删减处理)

给定一个数组 nums ,将其划分为两个连续子数组 left 和 right, 使得:left 中的每个元素都小于或等于 right 中的每个元素。left 和 right 都是非空的。left 的长度要尽可能小。在完成这样的分组后返回 left 的 长度 。

分析

从题目中,我们能够很容易的得知,如果想要 left 的每一个元素都要小于等于 right 中的每个元素,那么对应的要求就应该是:

  • left 中的最大值要小于或者等于 right 中的最小值

为了达到上面的规定,我们可以创建一个数组 tmp,然后一次去遍历原始数组。在遍历过程中,我们需要维护一个变量mid,它的值是遍历过程中最大的数值,找到的第一个即为答案。此时left 的长度就是 i+1,在题目的条件约束中,我们可以知道在 n-1 之前一定会有结果,即最后的解答结果。

总结

一道比较困难的算法题。其实这道题目最核心的地方就是寻找截断点。我们在解答的过程中使用的两次遍历。两次遍历的好处在于能够更好的控制变量,而且对于刚学习算法的同学来说,理解起来也更容易。

事实上,还有一次遍历的解答方法。但是这里就不提了。有兴趣的同学可以在网上搜索一下。总的来说,这道题目具有一定的挑战性,如果你刚开始的时候并不能AC,我的建议是最好看完解答,整理一下思路,然后自己动手写一遍。

解题证明

image.png