C++ 中分割列表


假设我们有一个名为 nums 的整数列表,我们需要确定是否可以将列表划分为两个子列表(非空),使得左侧部分中的每个数字都严格小于右侧部分中的每个数字。

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

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

  • n := nums 的大小

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

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

  • left[0] := nums[0]

  • right 的最后一个元素 := nums 的最后一个元素

  • 对于初始化 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],则:

      • 返回 true

  • 返回 false

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

示例

 现场演示

#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

更新于: 2020年9月2日

892 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告