《疯狂子数组的统计》《桥梁最高高度》《等和子数组问题》

63 阅读3分钟

《疯狂子数组的统计》

题面

image.png

问题理解

题目要求我们计算数组 A 中所有的“疯狂子数组”的数量。一个子数组被称为“疯狂子数组”,当且仅当它包含至少 K 次某个元素 X

数据结构选择

通过 std::map<int, int> 来记录每个元素在当前子数组中出现的次数。

算法步骤

  1. 初始化

    • ret 用于记录疯狂子数组的数量。
    • count 用于记录当前子数组中满足出现次数至少为 K 的元素的数量。
    • cache 用于记录每个元素在当前子数组中出现的次数。
    • l 用于标记当前子数组的左边界。
  2. 遍历数组

    • 对于每个元素 A[i],将其加入 cache 并更新其计数。
    • 如果 A[i] 的计数达到 K,则增加 count
    • 使用 while 循环调整左边界 l,确保子数组中满足条件的元素数量不超过 count
    • 如果 count 大于 0,说明当前子数组是疯狂子数组,增加 ret
  3. 返回结果

    • 最终返回 ret,即疯狂子数组的数量。

具体实现

int solution(int N, int K, std::vector<int> A) {
    int ret = 0;
    int count = 0;
    map<int, int> cache;
    int l = 0;
    for (int i = 0; i < N; i++) {
        cache[A[i]]++;
        if (cache[A[i]] == K) {
            count++;
        }
        while (l + 1 <= i && count - (cache[A[l]] == K) > 0) {
            cache[A[l]]--;
            if (cache[A[l]] == K - 1) {
                count--;
            }
            l++;
        }
        ret += count > 0 ? l + 1 : 0;
    }
    return ret;
}

《桥梁最高高度》

题面

image.png

问题理解

题目要求我们搭建一座桥,桥由 n 根桥柱组成,其中第一根和最后一根桥柱的高度已经确定为 ab。相邻桥柱的高度差不能超过 1。我们需要计算在满足这些条件下,桥梁中最高的桥柱的高度。

解题思路

  • 高度差计算abs(a - b) 计算了第一根和最后一根桥柱的高度差。

  • 桥柱数量限制n - 2 表示除了第一根和最后一根桥柱之外,中间可以放置的桥柱数量。

  • 可行性判断n - 2 - abs(a - b) >= -1 判断是否可以在 n 根桥柱内逐步变化到目标高度。如果这个条件不满足,说明无法在 n 根桥柱内完成高度变化,返回 -1

  • 最高桥柱高度计算(n - 2 - abs(a - b) + 1) / 2 + max(a, b) 计算了最高桥柱的高度。这里 (n - 2 - abs(a - b) + 1) / 2 表示在中间桥柱中,高度变化的最大步数,max(a, b) 表示第一根或最后一根桥柱的高度。

具体实现

int solution(int n, int a, int b) {
    return n - 2 - abs(a - b) >= -1 ? (n - 2 - abs(a - b) + 1) / 2 + max(a, b) : -1;
}

《等和子数组问题》

题面

image.png

问题理解

题目要求判断是否存在两个不同的长度相同的子数组,它们的元素总和相等。数组A是按非递减顺序排序的。

解题思路

题目要求两个子数组长度相同 && 元素总和相等,因为数组已经按照非递减顺序排序,只需判断是否存在相邻元素相等即可

具体实现

bool solution(int N, const std::vector<int>& A) {
    // write code here
    for(int i = 1;i < N;i++){
        if(A[i] == A[i - 1]){
            return true;
        }
    }
    return false; // Placeholder return
}