传送门
852. 山脉数组的峰顶索引
题解:根据描述,只需要找到最大值所在的索引即可
代码语言:javascript复制int peakIndexInMountainArray(vector<int>& A) {
return max_element(A.begin(),A.end())-A.begin();
}
853. 车队
题解:根据描述,第一想法是通过模拟,每经历一段时间,更新每辆车的位置,再判断各辆车的位置,对每辆车的速度进行更新,不太好些代码。
那么尝试从结果出发,如果某车所在位置小,到达终点所需时间大则说明追不上前面的车。
那么构建vector<pair<距离,时间>>
这样向量,依据车所在位置降序排序以后,0索引0处的车子在索引1处前面,当0处的车子的时间小于1处的车子的时间,那么1处的车子追不上1处的车子,车队数目加一。能够被追上车队是花费时间最多的那队。
struct cmp{
bool operator()(const pair<int,double>a,const pair<int,double>b){
return a.first>b.first;
}
};
int carFleet(int target, vector<int>& position, vector<int>& speed){
int len = position.size();
if(len==0) return 0;
vector<pair<int,double>>car(len);
for(int i=0;i<len;i )
{
car[i] = make_pair(position[i], (target-position[i])/(double)speed[i]);
}//组成位置,到达目的地,不需要变更车速所需时间
sort(car.begin(),car.end(),cmp());
int ret = 1;
double flag = car[0].second;
for(int i=1;i<len;i )
{
if(car[i].second>flag)//追不上最慢的,在前面的车队,因为降序,接下来序列中的车子都在后面
{
ret ;
flag = car[i].second;
}
}
return ret;
}
855. 考场就座
题解:题目意思可以简化为男生上厕所问题。
设置一个set<int>students
,存放所有学生,学生0,就插入0到set中,学生N-1,就插入N-1。
- seat():当set里面没有学生,自然就需要插入0。 当set里面有学生,就需要找出那个位置最适合插入。怎么找到这个最大位置? 当set里面只有一个元素,那么需要在这个元素位置向左看,向右看 当set里面有多个元素,那么需要计算这个元素之间的距离,以及最左边元素离0位置,最右边元素离N的距离。
- leave():直接earse(p)即可。
class ExamRoom {
public:
int N;
set<int>students;
ExamRoom(int N) {
this->N = N;
}
int seat() {
if(students.size()==0)
{
students.insert(0);
return 0;
}
if(students.size()>0)
{
//找到合适的位置插入,可以计算出距离最大间隔位置
int dist = *(students.begin());//一开始的距离是该值减去0
int pre = INT_MIN;
int student=0;
for (auto s: students) {
if (pre != INT_MIN) {
int d = (s - pre) / 2;
if (d > dist) {
dist = d;
student = pre d;
}
}
pre = s;
}
//最右边元素离N的距离判断
if (N - 1 - *students.rbegin() > dist)
student = N - 1;
students.insert(student);
return student;
}
return 0;
}
void leave(int p) {
if(students.find(p)!=students.end()){
students.erase(p);
}
}
};