《疯狂子数组的统计》
题面
问题理解
题目要求我们计算数组 A 中所有的“疯狂子数组”的数量。一个子数组被称为“疯狂子数组”,当且仅当它包含至少 K 次某个元素 X。
数据结构选择
通过 std::map<int, int> 来记录每个元素在当前子数组中出现的次数。
算法步骤
-
初始化:
ret用于记录疯狂子数组的数量。count用于记录当前子数组中满足出现次数至少为K的元素的数量。cache用于记录每个元素在当前子数组中出现的次数。l用于标记当前子数组的左边界。
-
遍历数组:
- 对于每个元素
A[i],将其加入cache并更新其计数。 - 如果
A[i]的计数达到K,则增加count。 - 使用
while循环调整左边界l,确保子数组中满足条件的元素数量不超过count。 - 如果
count大于 0,说明当前子数组是疯狂子数组,增加ret。
- 对于每个元素
-
返回结果:
- 最终返回
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;
}
《桥梁最高高度》
题面
问题理解
题目要求我们搭建一座桥,桥由 n 根桥柱组成,其中第一根和最后一根桥柱的高度已经确定为 a 和 b。相邻桥柱的高度差不能超过 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;
}
《等和子数组问题》
题面
问题理解
题目要求判断是否存在两个不同的长度相同的子数组,它们的元素总和相等。数组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
}