C++ 中将数组分成和相等的子数组


假设我们有一个包含 n 个整数的数组,我们需要找到是否满足以下条件的三元组 (i, j, k):

  • 0 < i, i + 1 < j, j + 1 < k < n - 1

  • 子数组 (0, i - 1), (i + 1, j - 1), (j + 1, k - 1) 和 (k + 1, n - 1) 的和相同。

子数组 (L, R) 是从索引 L 到索引 R 的原始数组的切片。

因此,如果输入为 [1,2,1,2,1,2,1],则输出为 True,因为 i = 1, j = 3, k = 5。

sum(0, i - 1) = 1 sum(0, 0) = 1
sum(i + 1, j - 1) = 1 sum(2, 2) = 1
sum(j + 1, k - 1) = 1 sum(4, 4) = 1
sum(k + 1, n - 1) = 1 sum(6, 6) = 1

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

  • n := nums 的大小

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

  • sums[0] := nums[0]

  • for i := 1 to n-1 do −

    • sums[i] := sums[i-1] + nums[i]

  • for j := 3 to n do −

    • 定义一个集合 s

    • for i := 1 to j - 2 do: −

      • sum1 := sums[i - 1]

      • sum2 := sums[j - 1] - sums[i]

      • if sum1 等于 sum2,则:

        • 将 sum1 插入 s

    • for k := j + 2 to n - 2 do −

      • sum1 := sums[k - 1] - sums[j]

      • sum2 := sums[n - 1] - sums[k]

      • if sum1 等于 sum2 且 sum1 在 s 中,则:

        • 返回 true

  • 返回 false

示例

让我们看看下面的实现,以便更好地理解:

在线演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   bool splitArray(vector<int>& nums) {
      int n = nums.size();
      vector<int> sums(n);
      sums[0] = nums[0];
      for (int i = 1; i < n; i++) {
         sums[i] += (nums[i] + sums[i - 1]);
      }
      for (int j = 3; j < n; j++) {
         set<int> s;
         for (int i = 1; i < j - 1; i++) {
            int sum1 = sums[i - 1];
            int sum2 = sums[j - 1] - sums[i];
            if (sum1 == sum2)
               s.insert(sum1);
         }
         for (int k = j + 2; k < n - 1; k++) {
            int sum1 = sums[k - 1] - sums[j];
            int sum2 = sums[n - 1] - sums[k];
            if (sum1 == sum2 && s.count(sum1))
               return true;
            }
         }
         return false;
      }
};
main(){
   Solution ob;
   vector<int> v = {1,2,1,2,1,2,1};
   cout << (ob.splitArray(v));
}

输入

{1,2,1,2,1,2,1}

输出

1

更新于:2020年11月16日

784 次浏览

开启你的职业生涯

完成课程获得认证

开始
广告
© . All rights reserved.