一、题目
有
n
个人前来排队买票,其中第0
人站在队伍 最前方 ,第(n - 1)
人站在队伍 最后方 。给你一个下标从 0 开始的整数数组
tickets
,数组长度为n
,其中第i
人想要购买的票数为tickets[i]
。每个人买票都需要用掉 恰好 1 秒 。一个人 一次只能买一张票 ,如果需要购买更多票,他必须走到 队尾 重新排队(瞬间 发生,不计时间)。如果一个人没有剩下需要买的票,那他将会 离开 队伍。
返回位于位置
k
(下标从 0 开始)的人完成买票需要的时间(以秒为单位)。
二、我的解答
这个题不难,因为限定条件很多——“恰好1秒”、“一次只能买一张票”……所以我做这道题没花多少时间。
话不多说,直接上代码。
class Solution {
public:
int timeRequiredToBuy(vector<int>& tickets, int k) {
//队列问题——出队列后-1然后加到队尾,直到为0
if(tickets[k]==0){
return 0;
}
if(tickets[k]==1){
return k+1;
}
int timeNum=0;
while(tickets[k]!=1){
for(int i=0;i<tickets.size();i++){
if(tickets[i]!=0){
tickets[i]--;
timeNum++;
}
else{
continue;
}
}
}
for(int i=0;i<k;i++){
if(tickets[i]!=0){
timeNum++;
}
}
return timeNum+1;
}
};
这个效率看起来海星。
三、优化解
讲真的,这个思路真的很妙啊!!
class Solution {
public:
int timeRequiredToBuy(vector<int>& tickets, int k) {
int n = tickets.size();
int res = 0;
for (int i = 0; i < n; ++i){
// 遍历计算每个人所需时间
if (i <= k){
res += min(tickets[i], tickets[k]);
}
else{
res += min(tickets[i], tickets[k] - 1);
}
}
return res;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/time-needed-to-buy-tickets/solutions/1102684/mai-piao-xu-yao-de-shi-jian-by-leetcode-jnfxx/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
供君参考。