-
发表于 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 题目链接
-