题目分析
这个题目中我们需要维护leftmax,当我们的leftmax比剩余数组元素都小是我们就可以将我们的断点进行返回了,但如果我们搜寻过程中遇到了更小的点,则将此点更新为新的断点。由于更新断点的过程中需要重置leftmax
,所以我们会记录下向右试探过程中的最大值,这个思路的最后结果就是第一个算法。
题主分享了一个答案,思路更为清晰,他记录下了A[:i]
的最大值和A[i:]
的最小值,然后依次循环遍历,当leftmax < rightmin
时这个点就成立。
代码
思路 1
class Solution {
public:
int partitionDisjoint(vector<int>& A) {
int leftmax = A[0], splitpoint = 0, i = 0;
while(i < A.size()){
if(A[i] < leftmax)
splitpoint = i++;
else if(A[i] > leftmax){
int max = leftmax;
while(i < A.size()){
if(A[i] > max)
max = A[i];
if(A[i] < leftmax)
break;
i++;
}
if(i == A.size())
return splitpoint + 1;
leftmax = max;
splitpoint = i;
}else
i++;
}
return splitpoint + 1;
}
};
思路 2
class Solution {
public:
int partitionDisjoint(vector<int>& A) {
vector<int> leftmax(A.size()), rightmin(A.size);
int lmax, rmin, loc;
lmax = leftmax[0] = A[0];
for(int i = 1; i < A.size(); i++)
lmax = leftmax[i] = max(leftmax[i - 1], A[i]);
rmin = rightmin[A.size() - 1] = A[A.size() - 1];
for(int i = A.size() - 2; i >= 0; i--)
rmin = rightmin[i] = min(rightmin[i + 1], A[i]);
for(loc = 0; loc < A.size() - 1; loc++)
if(leftmax[loc] <= rightmin[loc + 1])
break;
return loc + 1;
}
};