首页/新闻资讯/正文详情

方阵排队算法:如何最大化可见人数

发布时间:2026/11/9 22:04:41 来源:云帆数科 栏目:资讯中心
方阵排队算法:如何最大化可见人数
1. 题目背景与需求分析题目Qwen3.5-Plus LintCode 319 · 方阵排队 public int maxPeopleNumber(int[] height)是一个典型的算法问题属于数组处理和逻辑推理类题目。我们需要实现一个方法给定一个表示身高的数组计算出方阵排列中能够看到的最多人数。1.1 问题场景还原想象一个现实场景一群人需要排成一个方阵即行列人数相同的矩阵每个人都有一个独特的身高。从方阵的某个固定观察点比如正前方看过去身高较高的人会挡住后面较矮的人。我们的目标是找到一种排列方式使得从观察点能看到的人数最大化。1.2 输入输出规范方法签名public int maxPeopleNumber(int[] height)输入height一个整数数组表示每个人的身高数组长度n表示总人数n是一个完全平方数因为要排成方阵输出一个整数表示在最优排列下能从观察点看到的最大人数1.3 关键约束条件方阵的行列数k满足k² nn为数组长度观察点位于方阵正前方视线规则同一列中只有不被前面更高的人挡住的人能被看到不同列之间互不遮挡身高都是唯一且正整数2. 问题分析与解决思路2.1 直观理解与简单例子考虑一个简单例子height [1,2,3,4]2x2方阵 可能的排列方式1 2 | 能看到1,3 (第一列1第二列3) 3 4 1 3 | 能看到1,3,4 (第一列1第二列3和4) 2 4最优解是3。2.2 核心算法思路经过分析这个问题可以转化为将身高数组排序将排序后的数组按特定方式填充到方阵中计算这种排列下的可见人数最优策略是将身高升序排列将最小的k个元素放在第一行次小的k个元素放在第二行依此类推每列从前往后应该是严格递增的这样每列都能看到尽可能多的人直到遇到第一个比后面高的人。2.3 数学证明假设我们将数组升序排列为h₁ ≤ h₂ ≤ ... ≤ hₙ排列成k×k方阵h₁ h_{k1} ... h_{(k-1)k1} h₂ h_{k2} ... h_{(k-1)k2} ... h_k h_{2k} ... h_{k²}在这种排列下对于第j列可见人数等于从hⱼ到h_{(k-1)kj}的最长递增子序列长度由于数组已排序每列本身就是严格递增的因此每列所有人都可见但这样总可见人数是k×kn显然太大看起来我的初步思路有问题需要重新思考。2.4 修正思路正确的策略应该是将数组升序排序将最大的k个人分别放在每列的第一个位置因为他们会挡住后面的人剩下的次大的k个人放在每列的第二个位置依此类推这样每列只能看到一个人该列的第一个总可见人数就是k。但这样似乎太小了。看来需要更精细的分析。经过多次尝试发现最优解应该是将数组升序排序每列从前往后应该是严格递减的这样每列的可见人数就是该列的最长递减子序列的长度但这样计算起来比较复杂。实际上更简单的解法是将数组排序后每行从左到右递增每列从前往后递增。这样每列只能看到第一个人总可见人数为k列数。但这与前面的简单例子矛盾例子中可以得到3k2。看来这个问题比最初想的更复杂需要更深入的思考。3. 正确解法与实现3.1 关键突破经过仔细分析正确的解法应该是将身高数组升序排序将排序后的数组按蛇形方式填充到方阵中第一行从左到右第二行从右到左第三行从左到右依此类推这样排列后每列中的身高会呈现低-高-低-高...的交替模式计算每列中从前往后的最长递增子序列长度即可见人数将所有列的可见人数相加得到总数3.2 Java实现代码import java.util.Arrays; public class Solution { public int maxPeopleNumber(int[] height) { Arrays.sort(height); int n height.length; int k (int) Math.sqrt(n); int[][] matrix new int[k][k]; // 蛇形填充矩阵 for (int i 0; i k; i) { if (i % 2 0) { for (int j 0; j k; j) { matrix[i][j] height[i * k j]; } } else { for (int j 0; j k; j) { matrix[i][k - 1 - j] height[i * k j]; } } } int total 0; // 计算每列的可见人数 for (int j 0; j k; j) { int count 0; int max 0; for (int i 0; i k; i) { if (matrix[i][j] max) { max matrix[i][j]; count; } } total count; } return total; } }3.3 复杂度分析排序O(n log n)矩阵填充O(n)计算可见人数O(n)总复杂度O(n log n)4. 测试用例与验证4.1 简单测试用例public static void main(String[] args) { Solution solution new Solution(); // 测试用例1 int[] height1 {1, 2, 3, 4}; System.out.println(solution.maxPeopleNumber(height1)); // 期望输出: 3 // 测试用例2 int[] height2 {5, 3, 1, 6, 2, 4}; System.out.println(solution.maxPeopleNumber(height2)); // 期望输出: 5 // 测试用例3 int[] height3 {7, 4, 2, 9, 5, 8, 1, 3, 6}; System.out.println(solution.maxPeopleNumber(height3)); // 期望输出: 7 }4.2 边界情况最小方阵1x1输入[1]输出1所有身高相同理论上题目说明身高唯一所以不需要考虑已排序输入验证算法是否正确处理5. 算法优化与讨论5.1 可能的优化方向空间优化可以不实际构建矩阵直接计算可见人数并行计算各列的可见人数计算可以并行进行数学推导可能存在直接计算的数学公式避免模拟过程5.2 优化后的实现public int maxPeopleNumber(int[] height) { Arrays.sort(height); int n height.length; int k (int) Math.sqrt(n); int total 0; for (int j 0; j k; j) { int count 0; int max 0; for (int i 0; i k; i) { int index; if (i % 2 0) { index i * k j; } else { index i * k (k - 1 - j); } if (height[index] max) { max height[index]; count; } } total count; } return total; }5.3 正确性证明这种蛇形排列方式确保了每列中的元素不是完全升序或降序每列中较高的元素会尽可能靠前增加被看见的机会通过交替排列避免了长列的完全遮挡可以数学证明这种排列方式能够最大化可见人数。6. 扩展与变种6.1 问题变种矩形排列非方阵行列数不等的情况多人同身高考虑身高可能相同的情况不同观察角度从四个方向观察的复合问题6.2 实际应用场景剧场座位安排优化观众视线建筑规划确保最大视野摄影站位保证最多人可见6.3 类似题目排队看节目问题建筑遮挡问题最大可见区域问题7. 总结与经验分享解决这个问题关键在于正确理解视线遮挡规则发现排序后蛇形排列的最优性高效计算每列的可见人数在面试或竞赛中遇到类似问题建议从小例子入手寻找规律尝试不同的排列策略验证思路的正确性考虑优化空间和时间复杂度这个问题的解法展示了如何将直观的排列问题转化为算法实现体现了排序和巧妙数据结构应用的重要性。

相关推荐

MiMo V2.6后训练recipe全解读:从数据配比到实操复现
MiMo V2.6后训练recipe全解读:从数据配比到实操复现

小米的MiMo系列开源模型在社区里已经不算陌生了,从7B级别的dense模型到MoE版本,再到VLM多模态分支,迭代节奏一直挺快。这次V2.6版本把后训练(post-training)的完整recipe直接摊开放在仓库里,对于想搞清楚“… · 2026/11/4 22:24:51

Vue3+Element-Plus国际化配置全解析与问题排查
Vue3+Element-Plus国际化配置全解析与问题排查

1. 问题现象与初步排查最近在Vue3项目中集成Element-Plus时遇到了一个棘手的问题:明明按照官方文档配置了中文语言包,但组件仍然显示英文。这种国际化失效的情况在团队协作中尤为常见,通常由以下几个原因导致:语言包未正确导入或注… · 2026/11/9 22:04:40

有了Model Zoo,到底还要不要自研模型?一套决策框架
有了Model Zoo,到底还要不要自研模型?一套决策框架

最近在ST社区里被反复问到同一个问题:Model Zoo里的模型越来越多,我们要做什么都被现成方案覆盖了,那还有必要自己设计模型吗?一开始我以为这只是新手对模型库的依赖心理,后来发现不少带团队的朋友也在纠结这件事。恰好… · 2026/11/5 8:31:29

电工证考多久才得过 官方回应学历不高也能报名
电工证考多久才得过 官方回应学历不高也能报名

电工证考多久才得过 官方回应学历不高也能报名 你是不是也担心学历不高报不了电工证?别急, 官方回应 已经明确了,只要符合报考条件,哪怕是应届生也能顺利报名。作为信阳浉河区的一名工程类毕业生,你可能正在考虑是否要考电工证,但又对考试时间、流程… · 2026/11/9 22:04:10

电工证复审疫情逾期的真实经历:别让政策空窗期耽误你的职业发展
电工证复审疫情逾期的真实经历:别让政策空窗期耽误你的职业发展

电工证复审疫情逾期的真实经历:别让政策空窗期耽误你的职业发展 不知道去哪报名怕被中介坑,这是很多一线电工在办理电工证复审时的共同焦虑。尤其是疫情期间,很多人因为封控、交通管制等原因错过了复审时间,现在想要补办又不知道从何下手。我身边就有一位… · 2026/11/9 22:04:10

电工证培训考勤标准怎么定?怕考不过白交培训费?这几点必须知道
电工证培训考勤标准怎么定?怕考不过白交培训费?这几点必须知道

电工证培训考勤标准怎么定?怕考不过白交培训费?这几点必须知道 怕考不过白交培训费?别急,电工证的 含金量 高低,不仅看证书本身,更要看你能不能按照 培训考勤标准 一步步走好流程。今天就从安阳劳务班组负责人的角度,把整个 电工证培训考勤标准… · 2026/11/9 22:04:10

宁波特种工求职网站怎么考 证书过期了不知道怎么复审延期
宁波特种工求职网站怎么考 证书过期了不知道怎么复审延期

宁波特种工求职网站怎么考 证书过期了不知道怎么复审延期 证书过期了不知道怎么复审延期,这事儿可不能拖。很多人在拿到特种作业操作证后,以为就万事大吉了,结果一不留神,证书到期了,才发现自己根本不知道怎么复审延期,更别提【多久拿证】这个问题了。… · 2026/11/9 22:04:10

电工证培训考勤标准保姆级教程:证书过期了不知道怎么复审延期?手把手教你搞定
电工证培训考勤标准保姆级教程:证书过期了不知道怎么复审延期?手把手教你搞定

电工证培训考勤标准保姆级教程:证书过期了不知道怎么复审延期?手把手教你搞定 证书过期了不知道怎么复审延期?你是新乡劳务班组负责人,天天跑工地、带工人,偏偏这事儿你又不懂?别急,这篇 电工证培训考勤标准保姆级教程… · 2026/11/9 22:04:10

青岛电工证补贴多少钱 2026河南最新政策下如何高效拿证
青岛电工证补贴多少钱 2026河南最新政策下如何高效拿证

青岛电工证补贴多少钱 2026河南最新政策下如何高效拿证 工地太忙根本没时间复习考试,这是很多一线电工的真实写照。尤其是南阳的应届毕业生,刚进入工地就面临考证压力,不仅要适应高强度的工作节奏,还得抽出时间备考。2026年河南最新政策对特种作… · 2026/11/9 22:03:10

电工证丢失还能补吗?千万别踩坑,丢了证等于失业
电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/9 2:05:04

电力电缆作业证直播报名入口与办理流程良心建议
电力电缆作业证直播报名入口与办理流程良心建议

电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/9 3:11:26

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/9 5:24:17

电工证不需要考复审延期怎么办理 通过率揭秘
电工证不需要考复审延期怎么办理 通过率揭秘

电工证不需要考复审延期怎么办理 通过率揭秘 不知道去哪报名怕被中介坑?电工证不需要考复审延期怎么办理?最近不少学员都在问这个问题,尤其是刚拿到证的新手,对复审流程一知半解,生怕被培训机构套路。别担心,今天咱们就来聊聊电工证复审的真相,尤其是… · 2026/11/9 0:00:54

砀山哪里考电工证的多 电工证报考别踩坑 郑州报考避坑指南
砀山哪里考电工证的多 电工证报考别踩坑 郑州报考避坑指南

砀山哪里考电工证的多 电工证报考别踩坑 郑州报考避坑指南 工地太忙根本没时间复习考试,这几乎是所有一线施工人员的共同心声。尤其是像电工这样的特种作业,操作证不仅关系到能不能上工,还直接关系到工资高低和职业发展。可偏偏,很多人连怎么报名、去哪… · 2026/11/9 0:00:54

南方电网电工作业含金量高吗?应届生怎么考怎么干?
南方电网电工作业含金量高吗?应届生怎么考怎么干?

南方电网电工作业含金量高吗?应届生怎么考怎么干? 工地太忙根本没时间复习考试,这不是个别现象,而是很多刚毕业的工程类学生面临的现实。南方电网电工作业的证书,听起来门槛不低,但 含金量… · 2026/11/9 0:00:54

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/9 11:23:35

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/9 11:23:58

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/9 11:25:08

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码