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

113 阅读3分钟

问题描述

公司正在进行优秀项目组评比的初选工作,参赛者有小C、小U、小R、小S、小M和小F的项目组。评委会已经根据他们提交的材料完成了打分,各个项目组的得分分别是s1,s2,s3,…,sks1​,s2​,s3​,…,sk​。评委们希望设定一个初选晋级的分数线xx,让所有得分大于xx的项目组晋级,其他的项目组将被淘汰。此外,评委们希望晋级的项目组数量和淘汰的项目组数量都在区间[m,n][m,n]之间。

显然,这个分数线xx可能不存在,也可能存在多个满足条件的分数线。如果不存在满足条件的xx,则输出−1−1;如果存在多个满足条件的分数线xx,则输出满足条件的最小分数线。


测试样例

示例 1:

输入:m = 2, n = 3, a = [1, 2, 3, 5, 6, 4]
输出:3

示例 2:

输入:m = 1, n = 2, a = [7, 8, 9, 3, 5]
输出:-1

示例 3:

输入:m = 1, n = 4, a = [7, 8, 9, 3, 5]
输出:3

题目分析

对于 返回 -1 的条件只有两个:

  1. n 作为最大的进入人数,项目的数量一定不会大于 2n
  2. m 作为最小的限制,那么项目数量 一定不能< 2m

对于成绩的寻找条件只有一个就是 count -n 和m的关系

  1. m其实限制的是 项目数量-n 剩下项目的数量 如果 count - n>=m ,说明对于n个人晋级最小的分数应该就是最后一个人的下一个。对应排完序也就是count -n-1
  2. 而对于count - n<m 晋级的人数应该是count - m最后位置为 m-1。

代码实现

import java.util.Arrays;

public class Main {
    public static int solution(int m, int n, int[] a) {
        // write code here
        int count = 0;
        int sum = 0;
        for (int i = 0; i < a.length; i++) {
            count ++;
        }
        Arrays.sort(a);
        if (count > 2*n|| count <2* m) {
            return -1;
        }

        if (count-n>=m) {
            sum= a[count-n-1];
        }else{
            sum= a[m-1];
        }
        System.out.println(sum);
        return sum ;
    }

    public static void main(String[] args) throws Exception{
        System.out.println(solution(2, 3, new int[]{1, 2, 3, 5, 6, 4}) == 3);
        Thread.sleep(100);
        System.out.println(solution(1, 2, new int[]{7, 8, 9, 3, 5}) == -1);
        Thread.sleep(100);
        System.out.println(solution(1, 4, new int[]{7, 8, 9, 3, 5}) == 3);
    }
}

代码逻辑分析

  1. 定义两个变量countsum,分别用于计数和累计结果。count初始化为0,sum初始化为0。

  2. 使用一个for循环遍历数组a,将count的值增加数组a的长度,即a.length。这个操作实际上没有意义,因为count应该用来计数数组中满足特定条件的元素数量,而不是数组的长度。

  3. 检查count的值是否大于2*n或小于2*m。如果是,则返回-1,表示没有符合条件的结果。

  4. 接下来,代码检查count-n是否大于等于m。如果是,则将sum设置为排序后数组的第count-n-1个元素(从0开始计数)。否则,将sum设置为排序后数组的第m-1个元素。

时间空间复杂度

  1. 数组排序

    • Arrays.sort(a) 的时间复杂度通常是 O(n log n),其中 n 是数组 a 的长度。
  2. 计数循环

    • 计数循环的时间复杂度是 O(n),因为它需要遍历整个数组一次。
  3. 总空间复杂度

    • 总的空间复杂度是 O(1),因为除了输入数组外,没有使用额外的空间。

综上所述,这段代码的时间复杂度是 O(n log n),空间复杂度是 O(1)。

总结

使用豆包MarsCode AI工具后,我的解题速度得到了显著提升,同时在知识整理和错题分析方面也有了长足的进步。我计划继续利用AI的功能结合传统学习资源,来加强我的算法基础,并挑战更高难度的题目。

希望我的这些经验能够对其他初学者有所启发和帮助。让我们共同享受学习算法带来的乐趣,并在这个过程中不断进步和成长!