优秀项目组初选评比 | 豆包MarsCode AI刷题

69 阅读3分钟

题目解析

本文是一篇题解分享,对应题目是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];
}

知识总结

  1. 排序的作用:排序不仅有助于简化区间问题的处理,还为区间计算提供了一个确定的顺序,方便算法设计。
  2. 区间问题分析:本题通过判断区间的相邻或重叠关系来决定问题是否有解,这是处理区间问题的一种常见思路。
  3. 双指针法的变种:在排序的基础上,通过索引的计算代替直接的双指针遍历,这种方法在区间边界明确时非常高效。

学习计划

  1. 加强区间问题练习:学习和总结区间相关的经典题目,如区间覆盖、区间合并、最小区间交集等。
  2. 深入理解排序与索引的关系:了解如何通过排序快速确定边界;练习基于索引的区间处理方法。
  3. 优化代码逻辑:进一步简化代码逻辑,提升可读性和易用性,同时确保能处理各种边界情况。

工具应用

  1. 个人导师:AI,比如豆包Marscode AI
  2. 题库:leetcode、牛客等
  3. 资料:B站题解视频、Github高收藏的仓库等。