Back to Leetcode

Readme

Two_Pointers/3634.Minimum-Removals-to-Balance-Array/Readme.md

latest1.2 KB
Original Source

3634.Minimum-Removals-to-Balance-Array

将数组从大到小排序之后,可以直观地想到:删减最小元素,And/Or 删减最大元素,都可以让剩余的最大值与最小值之间的倍数关系降到k以下。所以问题转变成了究竟删几个最小值和几个最大值。

假设我们保留最小值nums[0],我们可以找到nums[j]恰好使得nums[j]>nums[i]*k,这就意味着必须将从j到n-1的元素都删除才能符合要求。

假设我们删除最小值nums[0]但保留次小值nums[1],那么我们发现为了保证最大元素与最小元素的ratio不超过k,那么j的极限位置可以单调地右移。确定了新的j之后,我们发现此时需要删除1+n-j个元素,其中1个是左边删除的小数,n-j个是右边删除的大数。

所以我们可以顺次移动左指针i,相应地单调移动右指针j,直至恰好j==n || nums[j]>nums[i]*k。此时两种情况:

  1. 如果j==n,说明ratio还没超过k,右端不需要删除任何数字。只需要删除左边的i个数字即可。
  2. 如果nums[j]>nums[i]*k,说明右端需要删除n-j个数字。左边需要删除i个数字。

遍历所有的i之后,取全局最小值。