LeetCode 3634.使数组平衡的最少移除数目
题目:
给你一个整数数组 nums
和一个整数 k
。
如果一个数组的 最大 元素的值 至多 是其 最小 元素的 k
倍,则该数组被称为是 平衡 的。
你可以从 nums
中移除 任意 数量的元素,但不能使其变为 空 数组。
返回为了使剩余数组平衡,需要移除的元素的 最小 数量。
注意:大小为 1 的数组被认为是平衡的,因为其最大值和最小值相等,且条件总是成立。
思路:
由于我们只关心剩余元素的最小值和最大值,不关心元素的顺序,所以可以先从小到大排序,方便后续计算。
排序后,枚举最大值 mx=nums[i],那么最小值 mn=nums[left] 必须满足mn⋅k ≥ mx,如果不满足,由于我们排序了,可以把 left 加1,直到满足上式。
可见,随着 i 的增大,left 要么不变,要么也增大,这可以用 滑动窗口解决。
用窗口长度 i−left+1 更新保留元素个数的最大值 maxSave。最终答案为 n−maxSave。
代码:
class Solution {public int minRemoval(int[] nums, int k) {Arrays.sort(nums);int left = 0;int ans = 0;int min = nums[left];for (int right = 0; right < nums.length; right++) {int max = nums[right];while ((long) min * k < max) {min = nums[++left];}ans = Math.max(ans, right - left + 1);}return nums.length - ans;}
}
性能: