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;
}
};