JZX轻语:简
LeetCode 1653 - 使字符串平衡的最少删除次数
发表于2026年02月07日
从左到右枚举所有的“分割点”,计算在该点处为了达成“左侧全是'a'、右侧全是'b'”的状态所需要删除的字符总数(即:左侧的'b'数量 + 右侧的'a'数量),求最小值即可。需要两次遍历:第一次遍历统计整个字符串中两个字符的数量;第二次遍历用于维护左(左侧已遍历的字符数量,可以计算右侧的字符数量)枚举右(分割点)。
class Solution {
public:
int minRemoval(vector<int>& nums, int k) {
std::sort(nums.begin(), nums.end());
int left = 0, right = 0;
int max_window = 0;
for (left = 0; left < nums.size(); ++left) {
while (right < nums.size() && nums[right] <= k * static_cast<unsigned long long>(nums[left])) {
++right;
}
max_window = max(max_window, right - left);
}
return nums.size() - max_window;
}
};