区间内排列的数量| 豆包MarsCode AI刷题

87 阅读4分钟

问题分析

我们有一个整数数组,目标是找出其中有多少个子区间满足特定条件。具体条件是:每个子区间中的数字应该恰好包含从 1 到某个数 kkk 的所有数字,并且每个数字只能出现一次。这样的子区间称为“排列”。

例如,对于数组 [2,1,5,3,4][2, 1, 5, 3, 4][2,1,5,3,4]:

  • 子区间 [2,1][2, 1][2,1] 是一个排列,因为它包含了从 1 到 2 的数字(即1和2),且每个数字只出现一次。
  • 子区间 [5,3,4][5, 3, 4][5,3,4] 是一个排列,因为它包含了从 1 到 3 的数字(即1, 2, 3)。
  • 子区间 [1,5,3,4][1, 5, 3, 4][1,5,3,4] 是一个排列,因为它包含了从 1 到 4 的数字(即1, 2, 3, 4)。

解题思路

我们可以通过逐一检查数组的每个子区间,来判断这个子区间是否满足“排列”的条件。下面是具体的解题步骤:

  1. 枚举子区间:对于数组中的每个元素,我们可以选择从该元素开始,逐步增加区间的长度。这样可以形成所有可能的子区间。

  2. 唯一性检查:为了判断一个子区间是否是“排列”,我们需要保证子区间内的数字不重复。这是因为“排列”要求每个数字出现一次且仅出现一次。因此,我们可以逐一检查子区间中的数字,确保没有重复的元素。

  3. 排列验证

    • 对于每一个子区间,如果它包含的所有数字都是从 1 到该区间的长度(记作 kkk)的每个数字,那么它就是一个排列。
    • 具体而言,如果子区间的最大数字恰好等于子区间的长度,且子区间的所有数字没有重复,那么这个子区间包含了从 1 到 kkk 的每个数字,也就是说这个子区间符合排列的条件。
  4. 计数:对于每一个符合“排列”条件的子区间,我们可以将其计数累加起来,得到最终满足条件的子区间数量。

示例讲解

让我们用一个例子来说明上述过程:

示例 1

输入:数组为 [2,1,5,3,4][2, 1, 5, 3, 4][2,1,5,3,4]

  • 从数组的第一个元素(数字2)开始,我们依次构造子区间:

    • 子区间 [2][2][2] 包含数字2,但不包含从 1 到 1 的所有数字,所以不满足条件。
    • 子区间 [2,1][2, 1][2,1] 包含数字1和2,且恰好是从1到2的排列,满足条件,计数+1。
    • 子区间 [2,1,5][2, 1, 5][2,1,5] 包含了1、2、5,缺少3和4,不满足条件。
    • 子区间 [2,1,5,3][2, 1, 5, 3][2,1,5,3] 仍然缺少4,不满足条件。
    • 子区间 [2,1,5,3,4][2, 1, 5, 3, 4][2,1,5,3,4] 包含了1到5的所有数字,满足条件,计数+1。
  • 从第二个元素(数字1)开始构造子区间:

    • 子区间 [1][1][1] 包含数字1,是从1到1的排列,满足条件,计数+1。
    • 子区间 [1,5][1, 5][1,5] 包含数字1和5,不满足条件。
    • 子区间 [1,5,3][1, 5, 3][1,5,3] 包含了1、3、5,不满足条件。
    • 子区间 [1,5,3,4][1, 5, 3, 4][1,5,3,4] 包含了1到4的所有数字,满足条件,计数+1。
  • 继续从其他元素开始重复以上过程。

最终统计到的符合条件的子区间数量为3。

示例 2

输入:数组为 [1,2,3,4,5][1, 2, 3, 4, 5][1,2,3,4,5]

  • 从第一个元素(数字1)开始构造子区间:

    • 子区间 [1][1][1] 包含数字1,满足从1到1的排列条件,计数+1。
    • 子区间 [1,2][1, 2][1,2] 包含了从1到2的所有数字,满足排列条件,计数+1。
    • 子区间 [1,2,3][1, 2, 3][1,2,3] 包含了从1到3的所有数字,满足排列条件,计数+1。
    • 子区间 [1,2,3,4][1, 2, 3, 4][1,2,3,4] 包含了从1到4的所有数字,满足排列条件,计数+1。
    • 子区间 [1,2,3,4,5][1, 2, 3, 4, 5][1,2,3,4,5] 包含了从1到5的所有数字,满足排列条件,计数+1。
  • 继续从其他元素出发时,仍然可以找到多个符合条件的子区间。

最终,符合条件的子区间数量为5。