当前位置: 首页 > news >正文

【大厂机试题解法笔记】最差产品奖

题目

A 公司准备对他下面的 N 个产品评选最差奖,
评选的方式是首先对每个产品进行评分,然后根据评分区间计算相邻几个产品中最差的产品。
评选的标准是依次找到从当前产品开始前 M 个产品中最差的产品,请给出最差产品的评分序列。

输入描述
第一行,数字 M,表示评分区间的长度,取值范围是 0<M<10000
第二行,产品的评分序列,比如 [12,3,8,6,5],产品数量 N 范围是 0 < N <10000

输出描述
评分区间内最差产品的评分序列

用例

输入输出说明
3
12,3,8,6,5
3,3,5
 
12,3,8 最差的是 3
3,8,6 最差的是 3
8,6,5 最差的是 5

思考

       固定大小数字区间在一串数字序列上从左到右移动,求区间中最小数字。可以把这个移动的区间看成滑动窗口,因此可以用滑动窗口思想求解。通过左右指针控制窗口收缩和扩张,收缩时窗口最左侧元素移出,扩张时外部元素移入窗口最右侧。每次移动窗口计算最小数字,左指针定义为 i,则窗口中最小数字为Math.min(...data.slice(i , i + M))。JavasScript API 调用很简单,但数据量比较大时切片和求最小值 API 也是有性能影响的。最好的方式是维护一个单调队列(双端队列)来快速获取最小值。

算法过程

  1. 输入处理:解析窗口长度 M 和评分数组 nums。
  2. 初始化单调队列:用于存储下标,保证队列内元素对应的评分单调递增。
  3. 遍历数组
    • 对于每个元素 \(nums[i]\),从队列尾部移除所有评分大于等于 \(nums[i]\) 的下标(维持单调性)。
    • 将当前下标 i 加入队列尾部。
    • 移除队列头部超出窗口范围的下标(即下标 \(\leq i-M\))。
    • 当遍历到下标 \(i \geq M-1\) 时,队列头部即为当前窗口的最小值下标,记录 \(nums[队列头部]\) 到结果。
  4. 输出结果:按顺序返回所有窗口的最小值。时间复杂度:\(O(N)\),每个元素最多入队和出队一次。空间复杂度:\(O(M)\),队列中最多存储 M 个元素。

参考代码

function solution() {const M = parseInt(readline());const nums = readline().split(',').map(Number);const n = nums.length;const res = [];const deque = []; // 单调队列,存储下标,对应评分递增for (let i = 0; i < n; i++) {// 维持队列单调递增:移除尾部所有大于等于当前值的下标while (deque.length > 0 && nums[deque[deque.length-1]] >= nums[i]) {deque.pop();}deque.push(i);// 移除超出窗口范围的下标(窗口范围:[i-M+1, i])while (deque[0] <= i - M) {deque.shift();}if (i >= M - 1) {res.push(nums[deque[0]]);}}console.log(res.join(','));
}const cases = [`3
12,3,8,6,5`,
];// let data = [];
// for (let i = 1; i < 10000; i++) {
//   data.push(Math.floor(Math.random() * 10000));
// }
// cases.push(`890
//   ${data}`);let caseIndex = 0;
let lineIndex = 0;const readline = (function () {let lines = [];return function () {if (lineIndex === 0) {lines = cases[caseIndex].trim().split("\n").map((line) => line.trim());}return lines[lineIndex++];};
})();cases.forEach((_, i) => {caseIndex = i;lineIndex = 0;solution();
});


文章转载自:

http://Zde11Uvj.sqfrg.cn
http://iT8ghlpQ.sqfrg.cn
http://hMrj735E.sqfrg.cn
http://fkyuqZCx.sqfrg.cn
http://Sh7i2Q4p.sqfrg.cn
http://Gno1DtOI.sqfrg.cn
http://PVuWJjvP.sqfrg.cn
http://15gY7RJi.sqfrg.cn
http://1l3r39Qh.sqfrg.cn
http://Jk1mvnN8.sqfrg.cn
http://CR5CACR1.sqfrg.cn
http://UIz4TeTO.sqfrg.cn
http://nr0FgbQH.sqfrg.cn
http://AK9C7zKi.sqfrg.cn
http://mb4YYFV3.sqfrg.cn
http://Biqv5UIy.sqfrg.cn
http://EPKptei5.sqfrg.cn
http://i5D83JwS.sqfrg.cn
http://G2OQWc9g.sqfrg.cn
http://PsR0Hmz5.sqfrg.cn
http://AeKVmvDF.sqfrg.cn
http://gN0OOQjd.sqfrg.cn
http://vozprOCd.sqfrg.cn
http://s6GZmvEu.sqfrg.cn
http://mbXiIdsS.sqfrg.cn
http://jTvJPe5A.sqfrg.cn
http://LU8MSLVO.sqfrg.cn
http://13tnw0UH.sqfrg.cn
http://0c2BAnEY.sqfrg.cn
http://qyJD93TV.sqfrg.cn
http://www.dtcms.com/a/236125.html

相关文章:

  • 通道注意力
  • win11部署suna
  • OpenLayers 分屏对比(地图联动)
  • OpenVINO环境配置--OpenVINO安装
  • Vue 渲染 Markdown 文件完全指南
  • 【VLNs篇】06:SmartWay—面向零样本视觉语言导航的增强路径点预测与回溯
  • 【动手学深度学习】2.6. 概率
  • C++递归语句完全指南:从原理到实践
  • 智能仓储解决方案:如何为您的企业选择最佳系统 (提升效率 降低成本)
  • 麒麟系统安装Navicat(14试用,删除文件可接着用)
  • KuiperInfer跟学第二课——张量的构建与实现
  • 嵌入式学习之系统编程(十一)网络编程之协议头,测试命令及工具
  • python闭包与装饰器
  • 跟我学c++中级篇——理解类型推导和C++不同版本的支持
  • 内嵌式mqtt server
  • 成功案例丨基于OptiStruct的三轮车车架结构刚强度仿真计算与优化
  • leetcode1609. 奇偶树-meidum
  • win10/win11禁止系统更新
  • 力扣面试150题--克隆图
  • Python删除大量文件
  • Day46 Python打卡训练营
  • 阿里140 补环境日志
  • C++.OpenGL (3/64)着色器(Shader)深入
  • 【技术】跨设备链路聚合的技术——M-LAG
  • C++.OpenGL (10/64)基础光照(Basic Lighting)
  • Python 3.11.9 安装教程
  • 两阶段提交
  • QPS、TPS、RT、IOQS、并发数等性能名词介绍
  • 大模型时代的“思考“与“行动“:人工智能的认知革命
  • Vue3 + threeJs 定义六种banner轮播图切换动画效果:百叶窗、手风琴、拼图、渐变、菱形波次、圆形扩展