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 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.