JZX轻语:简
LeetCode 3634 - 使数组平衡的最少移除数目
发表于2026年02月06日
核心思路是利用排序+滑动窗口(双指针)来寻找满足条件的最长子数组。既然我们要删除最少的元素,反过来想,就是要在原数组中保留尽可能多的元素,使它们组成一个“平衡”的数组。由于“平衡”数组的判定条件只看最小值和最大值的大小关系,因此可以先将原来的数组进行排序,然后使用滑动窗口不断枚举(并固定)左边界、扩展右边界以计算所能形成的满足条件的最长子数组,最后取最大值,计算和数组总长的差值即可。
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;
}
};