力扣题解 2073

大家好,欢迎来到无限大的频道

今日继续给大家带来每日一题的题解

题目描述(简单)

买票需要的时间
有 n 个人前来排队买票,其中第 0 人站在队伍 最前方 ,第 (n - 1) 人站在队伍 最后方 。

给你一个下标从 0 开始的整数数组 tickets ,数组长度为 n ,其中第 i 人想要购买的票数为 tickets[i] 。

每个人买票都需要用掉 恰好 1 秒 。一个人 一次只能买一张票 ,如果需要购买更多票,他必须走到 队尾 重新排队(瞬间 发生,不计时间)。如果一个人没有剩下需要买的票,那他将会 离开 队伍。

返回位于位置 k(下标从 0 开始)的人完成买票需要的时间(以秒为单位)。
在这里插入图片描述
在这里插入图片描述

题目要求模拟一个排队买票的过程,并计算队伍中第 ( k ) 个人买完所有票所需的时间。

题目解析

给定一个整数数组 tickets,表示每个人需要买的票数,其中第 ( i ) 个人需要购买 tickets[i] 张票。队伍中每个人按顺序依次买票,每次买一张票并消耗 1 秒的时间。如果一个买完了自己的所有票,他们退出队伍;否则,他们走到队尾继续排队。需要找到队伍中第 ( k ) 个人买完所有票所需的总时间。

解题思路

  1. 模拟购买过程:我们需要根据给定的 tickets 数组,模拟每一秒钟的买票行为。
  2. 循环队伍:用一个循环结构模拟队列中每个人轮流买票的行为。
  3. 计数时间:维护一个计数器 time,记录总的买票时间。
  4. 判断买票完成:每次减去一个票依次模拟买票,直到队伍中 ( k ) 位置的票数减为零。
  5. 条件判断:确保只有 ( k ) 位置的人买完票时才返回时间。

代码实现

C实现

#include <stdio.h>

int timeRequiredToBuy(int* tickets, int n, int k) {
    int time = 0;
    while (tickets[k] > 0) {
        for (int i = 0; i < n; i++) {
            if (tickets[i] > 0) {
                tickets[i]--;
                time++;
                if (tickets[k] == 0) {
                    return time;
                }
            }
        }
    }
    return time;
}

C++实现


int timeRequiredToBuy(vector<int>& tickets, int k) {
    int time = 0;
    while (tickets[k] > 0) {
        for (int i = 0; i < tickets.size(); i++) {
            if (tickets[i] > 0) {
                tickets[i]--;
                time++;
                if (tickets[k] == 0) {
                    return time;
                }
            }
        }
    }
    return time;
}

这两个实现都采用了简单的模拟策略,逐步执行每一秒的买票情况,直至完成目标。通过循环和条件判断,可以有效地模拟整个买票过程并得出结果。

对于上述 C 和 C++ 代码实现,时间复杂度和空间复杂度分析如下:

时间复杂度

代码中有一个 while 循环嵌套一个 for 循环,具体分析如下:

  1. 外层 while 循环:这个循环会一直执行,直到 tickets[k] 变为 0。最坏情况下,每个人都需要买完所有的票,因此外层循环的次数与最大票数有关。

  2. 内层 for 循环:这个循环遍历整个队列的每一个人,执行一次需要 ( O(n) ) 的时间,其中 ( n ) 是队列中的人数。

因此,最坏情况下,每个人都买完所有票的情况下,时间复杂度为 ( O(m \times n) ),其中 ( m ) 是 tickets 数组中最大的元素值(即最大票数),而 ( n ) 是队伍中人的数量。

空间复杂度

代码中使用了一个数组 tickets 来存储每个人需要购买的票数:

  • 空间复杂度:代码中没有使用额外的与输入大小相关的存储空间,除了输入的 tickets 数组本身。因此,空间复杂度是 ( O(1) ),如果不考虑输入数组的空间消耗。

总结:

  • 时间复杂度:( O(m \times n) )
  • 空间复杂度:( O(1) )(不计输入)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值