【解题思路】 首先遍历数组,记录每个元素的出现次数。然后再次遍历数组,找到第一个出现次数大于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),使用了一个哈希表存储每个元素的出现次数

小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想知道他最多可以移除多少个球。【输入格式】第一

原文地址: http://www.cveoy.top/t/topic/iGJ5 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录