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;
    }
};

闪念标签:LC

题目链接:https://leetcode.cn/problems/minimum-removals-to-balance-array