给出一个长度为n的序列a和一个正整数k。 小A认为一个长度为m序列a是美丽的,当且仅当这个序列所有相邻的两数之和是k的倍数. 小A有一个长度为n的序列a,他想删去尽量少的数使得剩下的序列变得美丽。 你需要帮他计算这个最小需要删除的数的个数。
时间: 2024-10-06 13:04:54 浏览: 102
这个问题可以通过哈希表(unordered_map)和滑动窗口的方法来解决。首先,我们需要遍历整个数组,对于每个元素,我们将它的值和它的前一个元素的值之和模 k 的余数存储到哈希表中。然后,我们维护两个指针,一个指向当前的美丽序列结尾,另一个用于移动,如果当前序列结尾处的元素的余数与下一个可能的元素相加能得到 k 的倍数,我们就向前移动指针。否则,就说明我们需要删除一个元素,更新哈希表中的余数,并增加删除次数。
下面是C++代码实现:
```cpp
#include <unordered_map>
int minDeletions(vector<int>& a, int k) {
unordered_map<int, int> count;
count[0] = 1; // 初始化第一个元素,其和为0的次数为1
int beautifulEnd = 0; // 当前美丽序列的末尾
int deletions = 0;
for (size_t i = 1; i < a.size(); ++i) {
int newSum = (a[i] + a[i - 1]) % k;
if (count.find(newSum) != count.end()) {
beautifulEnd++;
} else {
deletions += count[newSum]; // 如果找不到对应的k倍数,从前面的美丽序列中删除相应次数
count[newSum]++; // 更新新元素的和的计数
}
count[a[i]]; // 更新当前元素的计数
}
return deletions;
}
```
阅读全文