news 2026/4/18 14:30:45

LeetCode 3634.使数组平衡的最少移除数目:滑动窗口+优化(一次二分查找+剪枝)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 3634.使数组平衡的最少移除数目:滑动窗口+优化(一次二分查找+剪枝)

【LetMeFly】3634.使数组平衡的最少移除数目:滑动窗口+优化(一次二分查找+剪枝)

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

给你一个整数数组nums和一个整数k

如果一个数组的最大元素的值至多是其最小元素的k倍,则该数组被称为是平衡的。

你可以从nums中移除任意数量的元素,但不能使其变为数组。

返回为了使剩余数组平衡,需要移除的元素的最小数量。

注意:大小为 1 的数组被认为是平衡的,因为其最大值和最小值相等,且条件总是成立。

示例 1:

输入:nums = [2,1,5], k = 2

输出:1

解释:

  • 移除nums[2] = 5得到nums = [2, 1]
  • 现在max = 2,min = 1,且max <= min * k,因为2 <= 1 * 2。因此,答案是 1。

示例 2:

输入:nums = [1,6,2,9], k = 3

输出:2

解释:

  • 移除nums[0] = 1nums[3] = 9得到nums = [6, 2]
  • 现在max = 6,min = 2,且max <= min * k,因为6 <= 2 * 3。因此,答案是 2。

示例 3:

输入:nums = [4,6], k = 2

输出:0

解释:

  • 由于nums已经平衡,因为6 <= 4 * 2,所以不需要移除任何元素。

提示:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 109
  • 1 <= k <= 105

解题方法:滑动窗口

元素顺序不影响结果,首先对原始数组按从小到大排个序。

枚举每一个最小元素的下标,不难发现随着最小元素的增大,最大元素也在增大。

因此可以使用两个指针l llr rr分别指向窗口起始下标和结束下标的下一位,那么窗口中元素则是平衡的。

l = 0 l=0l=0开始不断右移左指针,每次确定右指针的位置,r − l r-lrl即位当前方案最多保留的元素。

优化

对于初始r rr的确定,一共有三种方法:

  1. 从后往前遍历
  2. 二分查找第一个大于n u m s [ 0 ] × k nums[0]\times knums[0]×k的下标 (二分查找小优化)
  3. 直接不找了,从r = 0 r=0r=0开始,第一次循环时不断往右遍历就会找到

如果r rr指针已经移出数组边界,则可提前结束左指针的右移。

时空复杂度分析

  • 时间复杂度O ( n ) O(n)O(n)
  • 空间复杂度O ( 1 ) O(1)O(1)

AC代码

C++
/* * @LastEditTime: 2026-02-06 19:14:06 */typedeflonglongll;classSolution{private:intgetLastRIndex(vector<int>&nums,ll k){if(nums[0]*k>INT_MAX){returnnums.size()-1;}vector<int>::iterator it=upper_bound(nums.begin(),nums.end(),nums[0]*k);returnmin((long)nums.size()-1,it-nums.begin());}public:intminRemoval(vector<int>&nums,ll k){sort(nums.begin(),nums.end());intkeep=1;for(intl=0,r=getLastRIndex(nums,k);;l++){while(r<nums.size()&&nums[r]<=nums[l]*k){r++;}keep=max(keep,r-l);if(r==nums.size()){break;}}returnnums.size()-keep;}};

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 12:55:15

代价函数,矩阵的计算

假设函数: h(x) a b*x 我们根据假设函数来进行图形的绘制与我们的数据进行比对 上图中的cost function即为代价函数为了更好的理解代价函数我们可以使用空间立体图形来对代价函数进行描述&#xff0c;对于一组数据而言我们根据其假设函数可以得出其代价函数&#xff0c;我们将…

作者头像 李华
网站建设 2026/4/18 11:05:05

低代码赋能供应商管理:打破管理壁垒,重塑供应链效能

在企业数字化转型浪潮中&#xff0c;供应链作为核心竞争力的重要载体&#xff0c;其稳定与高效直接关乎企业生存发展。而供应商管理作为供应链体系的关键一环&#xff0c;传统管理模式的痛点日益凸显&#xff0c;亟需全新技术手段破局。低代码平台凭借灵活、高效的特性&#xf…

作者头像 李华
网站建设 2026/4/18 6:38:36

从IPD实践者到研发体系架构师:(二)以“岐黄之术”的望闻问切,透视研发体系健康度与瓶颈

研发体系是企业创新核心引擎&#xff0c;其健康度直接决定技术竞争力与长期生命力。研发投入产出失衡、流程碎片化、资源配置低效等共性痛点&#xff0c;制约企业突破发展&#xff0c;精准评估研发体系健康状态、定位症结&#xff0c;是提升研发效能的关键。正如中医诊疗“治病…

作者头像 李华
网站建设 2026/4/17 20:04:56

CANN模型量化实战:INT8推理加速与精度保持

引言 模型量化是将浮点模型转换为低精度整数模型的技术&#xff0c;可以显著降低模型大小、提升推理速度并减少功耗&#xff0c;是模型部署的重要优化手段。华为CANN平台提供了完善的量化工具链&#xff0c;支持训练后量化和量化感知训练&#xff0c;能够在保持模型精度的同时…

作者头像 李华
网站建设 2026/4/18 6:38:24

你可能需要的算法思想——哈希表

在很多算法问题中&#xff0c;我们需要知道某个元素是否出现过、出现了几次&#xff0c;第一次出现的位置在哪里。如果用数组或列表&#xff0c;查找通常需要线性扫描&#xff0c;时间复杂度是 O(n)。即使通过排序配合二分查找&#xff0c;将查找复杂度降为 O(log n)&#xff0…

作者头像 李华
网站建设 2026/4/18 6:38:18

如何高效维护单机版本app和联网版本app

如何高效管理“两个App”的挑战&#xff1f;虽然维护两个版本会增加工作量&#xff0c;但通过合理的架构设计和技术管理&#xff0c;可以大幅降低维护成本。以下是具体方案&#xff1a;方案一&#xff1a;模块化架构 条件编译&#xff08;最推荐的技术方案&#xff09; 这是解…

作者头像 李华