题目解析
本文是一篇题解分享,对应题目是AI刷题板块的简单题-《优秀项目组初选评比》。 问题简述如下:
公司正在进行优秀项目组的初选评比工作,每个项目组的得分分别是S1、S2...Sk,现在需要设置一个分数线X,使得晋级的项目组和淘汰的项目组的数量都在[m,n]之间。当然这个分数线可能不存在,此时输出-1,如果存在满足条件的多个分数线,则返回最小的
思路分析
要解决这个问题,我们需要分步骤进行分析和实现:
-
排序分数:先对分数数组进行升序排序,以便快速确定项目组的得分分布,以及筛选合适的分数线。
-
区间计算:淘汰的项目组数量范围为 [m, n],对应的索引范围为 [m-1, n-1];晋级的项目组数量范围为 [m, n],对应的索引范围为 [len-n, len-m]。
-
区间重叠:只有当淘汰区间 [m-1, n-1] 与晋级区间 [len-n, len-m] 相邻或重叠时,才存在分数线 X。如果两个区间完全分离,则返回 -1。
-
选择最优分数线:在区间重叠的情况下,找到符合条件的最小分数线。
完整代码
完整代码如下
public static int solution(int m, int n, int[] a) {
// 先对分数进行排序
Arrays.sort(a);
// 分别确认淘汰和晋级的区间
// 淘汰者区间的下标
int loseLeft = m - 1;
int loseRight = n - 1;
// 晋级者区间的下标
int winRight = a.length - m;
int winLeft = a.length - n;
// 要求:分数尽可能低 == 尽可能让更多人晋级
if(loseRight + 1 < winLeft || winRight <= loseLeft){ // 区间不重叠或不相邻
return -1;
}
int resIndex;
if(winLeft >= loseLeft){
resIndex = winLeft - 1;
}
else {
resIndex = loseLeft;
}
return a[resIndex];
}
知识总结
- 排序的作用:排序不仅有助于简化区间问题的处理,还为区间计算提供了一个确定的顺序,方便算法设计。
- 区间问题分析:本题通过判断区间的相邻或重叠关系来决定问题是否有解,这是处理区间问题的一种常见思路。
- 双指针法的变种:在排序的基础上,通过索引的计算代替直接的双指针遍历,这种方法在区间边界明确时非常高效。
学习计划
- 加强区间问题练习:学习和总结区间相关的经典题目,如区间覆盖、区间合并、最小区间交集等。
- 深入理解排序与索引的关系:了解如何通过排序快速确定边界;练习基于索引的区间处理方法。
- 优化代码逻辑:进一步简化代码逻辑,提升可读性和易用性,同时确保能处理各种边界情况。
工具应用
- 个人导师:AI,比如豆包Marscode AI
- 题库:leetcode、牛客等
- 资料:B站题解视频、Github高收藏的仓库等。