小X和球ballcpp时间限制:1s 空间限制:512 MB【问题描述】小X有n个排成一条直线的一排球从左边算起的第i个球的颜色为ai。小X可以执行以下操作若干次:·选择数组下标i和j满足1≤ij≤n 且 ai=aj·将aiai+1…aj从数组中移除并将aj右侧的所有的元素的下标减少j-i+1即移除区间lr中的所有的球并将右侧的球左移填满空位。现在小X想知道他最多可以移除多少个球。【输入格式】第一
【解题思路】 首先遍历数组,记录每个元素的出现次数。然后再次遍历数组,找到第一个出现次数大于1的元素,并记录其下标。接着从该下标开始向后遍历,找到第一个不等于当前元素的元素,并记录其下标。将这两个下标之间的元素移除,并将后面的元素向前移动。最后返回移除的球的总数。
【代码实现】
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int removeBalls(int n, vector<int>& a) {
unordered_map<int, int> count; // 记录每个元素的出现次数
for (int i = 0; i < n; i++) {
count[a[i]]++;
}
int res = 0;
for (int i = 0; i < n; i++) {
if (count[a[i]] > 1) { // 找到第一个出现次数大于1的元素
int j = i + 1;
while (j < n && a[j] == a[i]) {
j++;
}
res += j - i - 1; // 移除的球的总数加上移除的个数
i = j - 1; // 更新下标
}
}
return res;
}
int main() {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int res = removeBalls(n, a);
cout << res << endl;
return 0;
}
【复杂度分析】 时间复杂度:O(n),其中n为球的总数。遍历两次数组,每次遍历的时间复杂度都是O(n)。 空间复杂度:O(n),使用了一个哈希表存储每个元素的出现次数
原文地址: http://www.cveoy.top/t/topic/iGJ5 著作权归作者所有。请勿转载和采集!