力扣3634. 使数组平衡的最少移除数目
这一题的大意是想要让数组处于一个平衡状态,这个状态就是数组中的最大值是<=最小数值*k,那么如何让这个数组保持平衡状态的元素尽可能多呢?(也就是题目上要求的最少移除数目)
根据题目上给出的数据范围是10^5,我们需要在一次遍历中找到数组保持平衡状态的最多元素,
我们可以选择先对数组进行排序,这样就不用不断地寻找最大最小值了,题目上也没有要求必须顺序性(例如子数组),因此我们可以先进行排序。
然后我们可以采用滑动窗口的方式,寻找目标,当窗口右端不断向前拓展碰到不符合条件的元素时,就让左边边界收缩这样能再度符合题目的平衡条件,在滑动窗口的过程中,我们不断用窗口大小来更新ans最终用元素总数-ans即为结果。
完整代码如下:
class Solution {
public:int minRemoval(vector<int>& nums, int k) {int n=nums.size();int l=0;int r=0;int ans=0;sort(nums.begin(),nums.end());while(r<n){if((long long) nums[l]*k>=nums[r]){//说明符合条件ans=max(ans,r-l+1);} else{while((long long)nums[l]*k<nums[r]){l++;}}r++;} return n-ans;}
};
时间复杂度O(nlogn)主要是排序的时间复杂度。
这道题和之前的一道题比较类似:无非本题是变长滑动窗口,而那道题是定长滑动窗口
如下
力扣1984. 学生分数的最小差值