题目解析
本题可以使用二分查找解题。
题目说:
非刺头同学在剩下的位置按照能力值从小到大排。
因此,每个非刺头学生,其实只需要关注他前面的刺头学生即可,因为他前面的非刺头学生的能力值一定不大于他。
我们可以定义一个集合 pricks 来记录刺头学生的能力值。
因此,我们遍历所有学生能力值时:
- 如果当前位置是刺头学生(根据第二行输入的刺头学生位置判断),那么就将当前学生能力值ability加入到pricks中,这里我们需要保证有序插入到 pricks 中。
- 如果当前位置是非刺头学生,那么我们需要找到当前学生能力值ability在pricks中的排名rank(其实也是有序插入位置),找到排名后,范围[rank, pricks.length - 1]内刺头学生都是能力比当前学生高的
按此逻辑,我们只要收集非刺头学生 前面 能力比自己高的 非刺头学生个数,如果最后总个数 > k,则老师无法教此班级,否则就可以。
上面逻辑中,我们有两个动作:
- 向 pricks 中有序插入 ability(注意,本题pricks从空开始有序插入ÿ