C ++中的分割清单

假设我们有一个称为nums的整数列表,我们必须确定是否可以将该列表划分为两个子列表(非空),以使左侧的每个数字严格小于右侧的每个数字。

因此,如果输入类似于[6,4,3,8,10],则输出为true,因为left = [6,4,3]和right = [8,10]

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

  • n:= nums的大小

  • 定义大小为n的数组权

  • 定义一个大小为n的数组

  • 左[0]:=数字[0]

  • 右边的最后一个元素:=数字的最后一个元素

  • 对于初始化i:= 1,当i <n时,更新(将i增加1),-

    • left [i]:= left [i-1]和nums [i]的最大值

  • 对于初始化i:= n-2,当i> = 0时,更新(将i减1),执行-

    • right [i]:= right [i + 1]和nums [i]的最小值

  • 对于初始化i:= 0,当i <n-1,更新(将i增加1)时,执行-

    • 返回真

    • 如果left [i] <right [i + 1],则-

  • 返回假

让我们看下面的实现以更好地理解-

示例

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   bool solve(vector<int> &nums) {
      int n = nums.size();
      vector<int> right(n);
      vector<int> left(n);
      left[0] = nums[0];
      right.back() = nums.back();
      for (int i = 1; i < n; i++) {
         left[i] = max(left[i - 1], nums[i]);
      }
      for (int i = n - 2; i >= 0; i--) {
         right[i] = min(right[i + 1], nums[i]);
      }
      for (int i = 0; i < n - 1; i++) {
         if (left[i] < right[i + 1])
         return true;
      }
      return false;
   }
};
main() {
   Solution ob;
   vector<int> v = {6,4,3,8,10};
   cout << (ob.solve(v));
}

输入项

{6,4,3,8,10}

输出结果

1