问题描述
公司正在进行优秀项目组评比的初选工作,参赛者有小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 的条件只有两个:
- n 作为最大的进入人数,项目的数量一定不会大于 2n
- m 作为最小的限制,那么项目数量 一定不能< 2m
对于成绩的寻找条件只有一个就是 count -n 和m的关系
- m其实限制的是 项目数量-n 剩下项目的数量 如果 count - n>=m ,说明对于n个人晋级最小的分数应该就是最后一个人的下一个。对应排完序也就是count -n-1
- 而对于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);
}
}
代码逻辑分析
-
定义两个变量
count和sum,分别用于计数和累计结果。count初始化为0,sum初始化为0。 -
使用一个
for循环遍历数组a,将count的值增加数组a的长度,即a.length。这个操作实际上没有意义,因为count应该用来计数数组中满足特定条件的元素数量,而不是数组的长度。 -
检查
count的值是否大于2*n或小于2*m。如果是,则返回-1,表示没有符合条件的结果。 -
接下来,代码检查
count-n是否大于等于m。如果是,则将sum设置为排序后数组的第count-n-1个元素(从0开始计数)。否则,将sum设置为排序后数组的第m-1个元素。
时间空间复杂度
-
数组排序:
Arrays.sort(a)的时间复杂度通常是 O(n log n),其中 n 是数组a的长度。
-
计数循环:
- 计数循环的时间复杂度是 O(n),因为它需要遍历整个数组一次。
-
总空间复杂度:
- 总的空间复杂度是 O(1),因为除了输入数组外,没有使用额外的空间。
综上所述,这段代码的时间复杂度是 O(n log n),空间复杂度是 O(1)。
总结
使用豆包MarsCode AI工具后,我的解题速度得到了显著提升,同时在知识整理和错题分析方面也有了长足的进步。我计划继续利用AI的功能结合传统学习资源,来加强我的算法基础,并挑战更高难度的题目。
希望我的这些经验能够对其他初学者有所启发和帮助。让我们共同享受学习算法带来的乐趣,并在这个过程中不断进步和成长!