C++ 中将数组划分成不相交区间


假设我们有一个数组 A,我们需要将其划分为两个子数组 left 和 right,使得:

  • left 子数组中的每个元素都小于或等于 right 子数组中的每个元素。

  • left 和 right 子数组都不为空。

  • left 子数组具有尽可能小的尺寸。

我们需要找到这种划分后 left 的长度。保证存在这样的划分。

例如,如果输入是 [5, 0, 3, 8, 6],则输出将是 3,因为 left 数组将是 [5, 0, 3],而 right 子数组将是 [8, 6]。

为了解决这个问题,我们将遵循以下步骤:

  • n := A 的大小,创建一个大小为 n 的数组 maxx

  • minVal := A 的最后一个元素

  • maxx[0] := A[0]

  • 对于 i 从 1 到 n – 1

    • maxx[i] := A[i] 和 A[i – 1] 中的最大值

  • ans := A 的大小 – 1

  • 对于 i 从 n – 1 到 1

    • minVal := minVal 和 A[i] 中的最小值

    • 如果 minVal >= max[i – 1],则 ans := i

  • 返回 ans

示例

让我们看看以下实现以更好地理解:

 在线演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int partitionDisjoint(vector <int>& A) {
      int n = A.size();
      vector <int> maxx(n);
      int minVal = A[n - 1];
      maxx[0] = A[0];
      for(int i = 1; i < n; i++){
         maxx[i] = max(A[i], maxx[i - 1]);
      }
      int ans = A.size() - 1;
      for(int i = n - 1; i >= 1; i--){
         minVal = min(minVal, A[i]);
         if(minVal >= maxx[i - 1]){
            ans = i;
         }
      }
      return ans;
   }
};
main(){
   vector<int> v1 = {5,0,3,8,6};
   Solution ob;
   cout << (ob.partitionDisjoint(v1));
}

输入

[5,0,3,8,6]

输出

3

更新于: 2020-04-30

358 次浏览

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告
© . All rights reserved.