915.Partition Array into Disjoint Intervals

915. Partition Array into Disjoint Intervals

给定一个数组 A,将其划分为两个不相交(没有公共元素)的连续子数组 left 和 right, 使得:

left 中的每个元素都小于或等于 right 中的每个元素。 left 和 right 都是非空的。 left 要尽可能小。 在完成这样的分组后返回 left 的长度。可以保证存在这样的划分方法。

  • 示例 1:

输入:[5,0,3,8,6]
输出:3
解释:left = [5,0,3],right = [8,6]
  • 示例 2:

输入:[1,1,1,0,6,12]
输出:4
解释:left = [1,1,1,0],right = [6,12]

方法: 要解决最短left子数组的问题,即要找一个临界点,左边的数的最大值都小于右边所有的数。

  1. 首先将A[0]设为max,将起始点设为1,然后比较右边所有的元素,如果有小于max的,则跳出循环

  2. 内层循环结束,如果已经遍历结束,则说明该起始点为所求临界点。

  3. 否则起始点自增,并判断起始点值是否大于max,如果是,则刷新max值为起始点值。继续循环判断。

  4. 起始点到达终点后,返回-1。

class Solution {
public:
    int partitionDisjoint(vector<int>& A) {
        int size=A.size();
        int max;
        max = A[0];
        int start=1;
        while(start<size)
        {
            int m=1,i;
            for(i=start;i<size;i++)
                if(A[i]<max) break;
            if (i==size)
                return start;
            else
            {
                max = (A[start]> max)?A[start]:max;
                start++;
            }
        }

        return -1;

    }
};

Last updated