bluecode-区间内排列的数量

25 阅读1分钟

问题描述

小U拿到了一组排列,她想知道有多少个子区间满足区间内部的数构成一个排列。一个区间的排列是指:该区间的数包含从 11 到 kk 的每个数,并且每个数恰好出现一次,这个区间的长度为 kk。

例如,对于数组 [2, 1, 5, 3, 4],其中区间 [2, 2][1,2] 和 [1, 5] 都是排列。


测试样例

样例1:

输入:n = 5 ,a = [2, 1, 5, 3, 4]
输出:3

样例2:

输入:n = 5 ,a = [1, 2, 3, 4, 5]
输出:5

样例3:

输入:n = 4 ,a = [4, 3, 2, 1]
输出:4

#include <algorithm>
#include <iostream>
#include <unordered_set>
#include <vector>

using namespace std;

int solution(int n, vector<int> &a) {
  int count = 0;
  for (int i = 0; i < n; ++i) {
    int max_val = 0;
    unordered_set<int> seen;
    for (int j = i; j < n; ++j) {
      int num = a[j];
      max_val = max(max_val, num);
      seen.insert(num);
      int k = j - i + 1;
      if (max_val == k && seen.size() == k) {
        count++;
      }
    }
  }
  return count;
}

int main() {
  vector<int> v1 = {2, 1, 5, 3, 4};
  vector<int> v2 = {1, 2, 3, 4, 5};
  vector<int> v3 = {4, 3, 2, 1};

  cout << (solution(5, v1) == 3) << endl;
  cout << (solution(5, v2) == 5) << endl;
  cout << (solution(4, v3) == 4) << endl;
  return 0;
}