Zamn 三元组的计数 | 豆包MarsCode AI刷题

88 阅读3分钟

Zamn 三元组的计数(Zamn 三元组的计数 - MarsCode

问题描述

小U定义了两个数 X 和 Y 是 “Zamn” 的,如果它们具有不同的奇偶性。也就是说,如果 X 是奇数,而 Y 是偶数,或者 X 是偶数,而 Y 是奇数,那么它们就是 “Zamn”。

现在给定一个大小为 N 的数组 A,其中每个元素的编号从 0 到 N-1。你需要计算所有的三元组 (i, j, k),其中 i < j < k,并且 (A[i], A[j]) 和 (A[j], A[k]) 都是 "Zamn" 关系。

这些三元组被称为 “Zamn” 三元组,你的任务是计算给定数组中所有的 “Zamn” 三元组的数量,并返回结果。

例如:当 N = 4 且 A = [1, 2, 5, 4] 时,数组中的 Zamn 三元组是 (0, 1, 2) 和 (1, 2, 3),因此计数等于 2


测试样例

样例1:

输入:N = 4,A = [1, 2, 5, 4]
输出:2

样例2:

输入:N = 5,A = [3, 6, 1, 8, 7]
输出:5

样例3:

输入:N = 6,A = [2, 3, 4, 5, 6, 7]
输出:8

问题解析

首先,我们需要明确“Zamn”关系的定义:两个数如果具有不同的奇偶性,则它们是“Zamn”的。这意味着一个数是奇数而另一个是偶数。

现在,我们要在给定数组中找到所有满足以下条件的三元组 (i, j, k):

  1. i<j<ki<j<k
  2. (A[i],A[j])(A[i],A[j]) 是“Zamn”关系
  3. (A[j],A[k])(A[j],A[k]) 也是“Zamn”关系

要计算给定数组中所有满足“Zamn”条件的三元组数量,我们需要遍历数组并检查每对元素之间的奇偶性关系。具体步骤如下:

  1. 遍历数组:我们需要遍历数组的所有可能的三元组 (i,j,k)(i, j, k),其中 i<j<ki < j < k
  2. 检查奇偶性:对于每个三元组,我们需要检查 (A[i],A[j])(A[i], A[j])(A[j],A[k])(A[j], A[k]) 是否都是“Zamn”关系,即它们的奇偶性不同。
  3. 计数:如果满足条件,则计数加一。

解决方案解析

暴力解法(三重循环)

最直接的方法是使用三重循环来遍历所有可能的三元组,并检查每一对是否满足“Zamn”关系。这种方法的时间复杂度是 O(N3)O(N^3),其中 N 是数组的长度。

  • 第一层循环:选择 ii
  • 第二层循环:在 ii 之后选择 jj
  • 第三层循环:在 jj 之后选择 kk

在每一对 (i,j)(i,j) 和 (j,k)(j,k) 上,我们检查它们的奇偶性是否不同。如果都满足,则计数器加一。

优化思路(前缀和)

虽然三重循环可以解决问题,但对于大型数组来说效率很低。我们可以考虑使用前缀和来优化。

  • 前缀和数组:我们可以创建两个前缀和数组,一个用于记录到当前位置为止的奇数数量,另一个用于记录偶数数量。
  • 遍历数组:然后,我们遍历数组,对于每个位置 jj,我们可以使用前缀和数组快速计算出在 jj 之前有多少个奇数和偶数。
  • 检查条件:对于每个 jj,我们再次遍历 jj 之后的位置 kk,并使用前缀和数组来检查 (A[j],A[k])(A[j],A[k]) 是否是“Zamn”关系。同时,我们还需要确保 (A[i],A[j])(A[i],A[j]) 也是“Zamn”关系,这可以通过在遍历 jj 时维护一个额外的状态来实现。

然而,这种优化方法虽然减少了内层循环的次数,但实现起来相对复杂,并且仍然需要至少 O(N2)O(N^2) 的时间复杂度来遍历所有可能的 (j,k)(j,k) 对。

以下是三重循环的python解法:

def solution(N, A):
    # 初始化计数器
    count = 0
    
    # 遍历所有可能的三元组 (i, j, k)
    for i in range(N):
        for j in range(i + 1, N):
            if (A[i] % 2 != A[j] % 2):  # 检查 (A[i], A[j]) 是否是 "Zamn"
                for k in range(j + 1, N):
                    if (A[j] % 2 != A[k] % 2):  # 检查 (A[j], A[k]) 是否是 "Zamn"
                        count += 1
    
    return count

if __name__ == '__main__':
    print(solution(N = 4, A = [1, 2, 5, 4]) == 2)
    print(solution(N = 5, A = [3, 6, 1, 8, 7]) == 5)
    print(solution(N = 6, A = [2, 3, 4, 5, 6, 7]) == 8)