915.Partition Array into Disjoint Intervals
915. Partition Array into Disjoint Intervals
给定一个数组 A,将其划分为两个不相交(没有公共元素)的连续子数组 left 和 right, 使得:
left 中的每个元素都小于或等于 right 中的每个元素。 left 和 right 都是非空的。 left 要尽可能小。 在完成这样的分组后返回 left 的长度。可以保证存在这样的划分方法。
  • 示例 1:
1
输入:[5,0,3,8,6]
2
输出:3
3
解释:left = [5,0,3],right = [8,6]
Copied!
  • 示例 2:
1
输入:[1,1,1,0,6,12]
2
输出:4
3
解释:left = [1,1,1,0],right = [6,12]
Copied!
方法: 要解决最短left子数组的问题,即要找一个临界点,左边的数的最大值都小于右边所有的数。
  1. 1.
    首先将A[0]设为max,将起始点设为1,然后比较右边所有的元素,如果有小于max的,则跳出循环
  2. 2.
    内层循环结束,如果已经遍历结束,则说明该起始点为所求临界点。
  3. 3.
    否则起始点自增,并判断起始点值是否大于max,如果是,则刷新max值为起始点值。继续循环判断。
  4. 4.
    起始点到达终点后,返回-1。
1
class Solution {
2
public:
3
int partitionDisjoint(vector<int>& A) {
4
int size=A.size();
5
int max;
6
max = A[0];
7
int start=1;
8
while(start<size)
9
{
10
int m=1,i;
11
for(i=start;i<size;i++)
12
if(A[i]<max) break;
13
if (i==size)
14
return start;
15
else
16
{
17
max = (A[start]> max)?A[start]:max;
18
start++;
19
}
20
}
21
22
return -1;
23
24
}
25
};
Copied!
Copy link