暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

915. Partition Array into Disjoint Intervals分割数组为不相交的区间

程序媛的梦想 2020-01-20
211

给了一个数组A,让我们分成两个相邻的子数组 left 和 right,使得 left 中的所有数字小于等于 right 中的,并限定了每个输入数组必定会有这么一个分割点,让返回数组 left 的长度。

思路:

遍历每个数字,更新当前最大值 curMax,并且判断若当前数字 A[i] 小于 preMax,说明这个数字也一定是属于 left 数组的,此时整个遍历到的区域应该都是属于 left 的,所以 preMax 要更新为 curMax,并且当前位置也就是潜在的分割点,所以 partitionIdx 更新为i。


curMax是遍历过的元素中的最大值,而preMax表示 left 中的最大值,curMax的作用主要是为了更新preMax,这样的话,是不是说curMaxpreMax和A[i]中的较大值?不是的,如:A = {2, 3, 1, 7, 8},当i=1的时候,curMax=3,而preMax不变=2,当i=2的时候,curMax=3还是等于3,而不是等于Math.max(preMax, A[2]}=Math.max{2, 1}=2,而此时preMax要更新为curMax的值,等于3。


这道题,其实只要出现后面的元素比前面的小,那这个后面的元素就肯定得归到left里面。如果出现递增,是不确定的,因为有可能后面还会遇到一个更加小的元素,这时递增的那对都得归到left中。 


时间复杂度:O(N), 空间复杂度:O(1)。

 1/**
2 * @author lxn
3 * @description 915. Partition Array into Disjoint Intervals
4 * @create 2020-01-18 17:02
5 */

6public class Algorithm915 {
7    public static void main(String[] args) {
8        int[] A = {50386};
9        int res = new Solution915().partitionDisjoint(A);
10    }
11}
12
13class Solution915 {
14    public int partitionDisjoint(int[] A) {
15        int partitionIdx = 0// 分割点的位置
16        int preMax = A[0]; // left中的最大值
17        int curMax = preMax; // 当前的最大值
18        for (int i = 1; i < A.length; ++i) {
19            curMax = Math.max(curMax, A[i]); // 当前的最大值。本例中,i=3的时候,A[i]=8, curMax更新为A[i]的值8
20            if (A[i] < preMax) { // 小于,当前的元素A[i]肯定属于left
21                preMax = curMax;// 更新left的最大值
22                partitionIdx = i;// 更新分割点的位置
23            }
24        }
25        return partitionIdx + 1// 左边的长度为index+1
26    }
27}

文章转载自程序媛的梦想,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论