news 2026/4/3 6:08:54

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/3/13 14:59:08

【毕设】基于Spring Boot技术的公司日常考勤系统

&#x1f49f;博主&#xff1a;程序员俊星&#xff1a;CSDN作者、博客专家、全栈领域优质创作者 &#x1f49f;专注于计算机毕业设计&#xff0c;大数据、深度学习、Java、小程序、python、安卓等技术领域 &#x1f4f2;文章末尾获取源码数据库 &#x1f308;还有大家在毕设选题…

作者头像 李华
网站建设 2026/3/13 1:10:18

Spring AI Alibaba 核心组件

Spring AI Alibaba 核心组件 Tools(工具) 工具创建 创建工具需要实现 BiFunction<String, ToolContext, String> 接口方法。 接口方法说明 接口中包含两个核心方法: apply方法(核心方法) 参数:String s - 通常是用户输入的参数 参数:ToolContext toolContext…

作者头像 李华
网站建设 2026/3/11 21:49:15

每位漏洞赏金猎手必用的十大必备工具

Member-only story“每位漏洞赏金猎手必用的十大工具” Aman Sharma 4 分钟阅读 2 天前 – Share 今天&#xff0c;我们将深入探讨每位漏洞赏金猎人都应该使用的十大必备工具。这些工具在社区中广为人知&#xff0c;它们可以显著提升你的漏洞挖掘技能&#xff0c;同时将对目标…

作者头像 李华
网站建设 2026/3/9 16:28:34

【防坑指南 | 可以不会不能不懂】夏日开车注意事项

一、 夏季用车核心检查点&#xff08;防高温、防爆胎、防自燃&#xff09; 1. 冷却系统&#xff08;重中之重&#xff09; 水温监控&#xff1a; 行驶中注意仪表盘水温表&#xff08;指针应在中间&#xff09;或水温报警灯。冷却液检查&#xff1a; 凉车状态下检查副水壶液面是…

作者头像 李华
网站建设 2026/3/18 19:20:58

CANN算子融合优化:提升推理性能的关键技术

【文章11】CANN算子融合优化&#xff1a;提升推理性能的关键技术 引言 在深度学习推理过程中&#xff0c;模型通常包含大量的小算子操作&#xff0c;频繁的算子调用和数据搬运会带来显著的性能开销。算子融合&#xff08;Operator Fusion&#xff09;是一种重要的优化技术&am…

作者头像 李华
网站建设 2026/4/1 21:24:16

CANN动态shape推理:处理可变输入的高效方案

引言 在实际的深度学习应用中&#xff0c;模型的输入尺寸往往不是固定的。例如&#xff0c;自然语言处理中的文本长度、目标检测中的图像分辨率、语音识别中的音频时长都可能变化。传统的静态shape推理需要为每种输入尺寸编译一个模型&#xff0c;既浪费存储空间&#xff0c;又…

作者头像 李华