diff --git a/solution/2000-2099/2073.Time Needed to Buy Tickets/README.md b/solution/2000-2099/2073.Time Needed to Buy Tickets/README.md index b3140552550b1..4b7367038f07d 100644 --- a/solution/2000-2099/2073.Time Needed to Buy Tickets/README.md +++ b/solution/2000-2099/2073.Time Needed to Buy Tickets/README.md @@ -67,7 +67,13 @@ tags: -### 方法一 +### 方法一:一次遍历 + +根据题目描述,当第 $k$ 个人完成购票时,在第 $k$ 个人前面的所有人,购买的票数都不会超过第 $k$ 个人购买的票数,而在第 $k$ 个人后面的所有人,购买的票数都不会超过第 $k$ 个人购买的票数减 $1$。 + +因此,我们可以遍历整个队伍,对于第 $i$ 个人,如果 $i \leq k$,购票时间为 $\min(\text{tickets}[i], \text{tickets}[k])$,否则购票时间为 $\min(\text{tickets}[i], \text{tickets}[k] - 1)$。我们将所有人的购票时间相加即可。 + +时间复杂度 $O(n)$,其中 $n$ 为队伍的长度。空间复杂度 $O(1)$。 @@ -77,11 +83,8 @@ tags: class Solution: def timeRequiredToBuy(self, tickets: List[int], k: int) -> int: ans = 0 - for i, t in enumerate(tickets): - if i <= k: - ans += min(tickets[k], t) - else: - ans += min(tickets[k] - 1, t) + for i, x in enumerate(tickets): + ans += min(x, tickets[k] if i <= k else tickets[k] - 1) return ans ``` @@ -91,12 +94,8 @@ class Solution: class Solution { public int timeRequiredToBuy(int[] tickets, int k) { int ans = 0; - for (int i = 0; i < tickets.length; i++) { - if (i <= k) { - ans += Math.min(tickets[k], tickets[i]); - } else { - ans += Math.min(tickets[k] - 1, tickets[i]); - } + for (int i = 0; i < tickets.length; ++i) { + ans += Math.min(tickets[i], i <= k ? tickets[k] : tickets[k] - 1); } return ans; } @@ -111,11 +110,7 @@ public: int timeRequiredToBuy(vector& tickets, int k) { int ans = 0; for (int i = 0; i < tickets.size(); ++i) { - if (i <= k) { - ans += min(tickets[k], tickets[i]); - } else { - ans += min(tickets[k] - 1, tickets[i]); - } + ans += min(tickets[i], i <= k ? tickets[k] : tickets[k] - 1); } return ans; } @@ -125,16 +120,15 @@ public: #### Go ```go -func timeRequiredToBuy(tickets []int, k int) int { - ans := 0 - for i, t := range tickets { - if i <= k { - ans += min(tickets[k], t) - } else { - ans += min(tickets[k]-1, t) +func timeRequiredToBuy(tickets []int, k int) (ans int) { + for i, x := range tickets { + t := tickets[k] + if i > k { + t-- } + ans += min(x, t) } - return ans + return } ``` @@ -142,25 +136,10 @@ func timeRequiredToBuy(tickets []int, k int) int { ```ts function timeRequiredToBuy(tickets: number[], k: number): number { - const n = tickets.length; - let target = tickets[k] - 1; let ans = 0; - // round1 - for (let i = 0; i < n; i++) { - let num = tickets[i]; - if (num <= target) { - ans += num; - tickets[i] = 0; - } else { - ans += target; - tickets[i] -= target; - } - } - - // round2 - for (let i = 0; i <= k; i++) { - let num = tickets[i]; - ans += num > 0 ? 1 : 0; + const n = tickets.length; + for (let i = 0; i < n; ++i) { + ans += Math.min(tickets[i], i <= k ? tickets[k] : tickets[k] - 1); } return ans; } diff --git a/solution/2000-2099/2073.Time Needed to Buy Tickets/README_EN.md b/solution/2000-2099/2073.Time Needed to Buy Tickets/README_EN.md index 97d6d1f99895e..ef0f47936e57a 100644 --- a/solution/2000-2099/2073.Time Needed to Buy Tickets/README_EN.md +++ b/solution/2000-2099/2073.Time Needed to Buy Tickets/README_EN.md @@ -67,7 +67,13 @@ The person at position 0 has successfully bought 5 tickets and it took 4 + -### Solution 1 +### Solution 1: Single Pass + +According to the problem description, when the $k^{th}$ person finishes buying tickets, all the people in front of the $k^{th}$ person will not buy more tickets than the $k^{th}$ person, and all the people behind the $k^{th}$ person will not buy more tickets than the $k^{th}$ person minus $1$. + +Therefore, we can traverse the entire queue. For the $i^{th}$ person, if $i \leq k$, the time to buy tickets is $\min(\text{tickets}[i], \text{tickets}[k])$; otherwise, the time to buy tickets is $\min(\text{tickets}[i], \text{tickets}[k] - 1)$. We sum the buying time for all people to get the result. + +The time complexity is $O(n)$, where $n$ is the length of the queue. The space complexity is $O(1)$. @@ -77,11 +83,8 @@ The person at position 0 has successfully bought 5 tickets and it took 4 + class Solution: def timeRequiredToBuy(self, tickets: List[int], k: int) -> int: ans = 0 - for i, t in enumerate(tickets): - if i <= k: - ans += min(tickets[k], t) - else: - ans += min(tickets[k] - 1, t) + for i, x in enumerate(tickets): + ans += min(x, tickets[k] if i <= k else tickets[k] - 1) return ans ``` @@ -91,12 +94,8 @@ class Solution: class Solution { public int timeRequiredToBuy(int[] tickets, int k) { int ans = 0; - for (int i = 0; i < tickets.length; i++) { - if (i <= k) { - ans += Math.min(tickets[k], tickets[i]); - } else { - ans += Math.min(tickets[k] - 1, tickets[i]); - } + for (int i = 0; i < tickets.length; ++i) { + ans += Math.min(tickets[i], i <= k ? tickets[k] : tickets[k] - 1); } return ans; } @@ -111,11 +110,7 @@ public: int timeRequiredToBuy(vector& tickets, int k) { int ans = 0; for (int i = 0; i < tickets.size(); ++i) { - if (i <= k) { - ans += min(tickets[k], tickets[i]); - } else { - ans += min(tickets[k] - 1, tickets[i]); - } + ans += min(tickets[i], i <= k ? tickets[k] : tickets[k] - 1); } return ans; } @@ -125,16 +120,15 @@ public: #### Go ```go -func timeRequiredToBuy(tickets []int, k int) int { - ans := 0 - for i, t := range tickets { - if i <= k { - ans += min(tickets[k], t) - } else { - ans += min(tickets[k]-1, t) +func timeRequiredToBuy(tickets []int, k int) (ans int) { + for i, x := range tickets { + t := tickets[k] + if i > k { + t-- } + ans += min(x, t) } - return ans + return } ``` @@ -142,25 +136,10 @@ func timeRequiredToBuy(tickets []int, k int) int { ```ts function timeRequiredToBuy(tickets: number[], k: number): number { - const n = tickets.length; - let target = tickets[k] - 1; let ans = 0; - // round1 - for (let i = 0; i < n; i++) { - let num = tickets[i]; - if (num <= target) { - ans += num; - tickets[i] = 0; - } else { - ans += target; - tickets[i] -= target; - } - } - - // round2 - for (let i = 0; i <= k; i++) { - let num = tickets[i]; - ans += num > 0 ? 1 : 0; + const n = tickets.length; + for (let i = 0; i < n; ++i) { + ans += Math.min(tickets[i], i <= k ? tickets[k] : tickets[k] - 1); } return ans; } diff --git a/solution/2000-2099/2073.Time Needed to Buy Tickets/Solution.cpp b/solution/2000-2099/2073.Time Needed to Buy Tickets/Solution.cpp index 03b07970f1918..25cf0315b56c6 100644 --- a/solution/2000-2099/2073.Time Needed to Buy Tickets/Solution.cpp +++ b/solution/2000-2099/2073.Time Needed to Buy Tickets/Solution.cpp @@ -3,11 +3,7 @@ class Solution { int timeRequiredToBuy(vector& tickets, int k) { int ans = 0; for (int i = 0; i < tickets.size(); ++i) { - if (i <= k) { - ans += min(tickets[k], tickets[i]); - } else { - ans += min(tickets[k] - 1, tickets[i]); - } + ans += min(tickets[i], i <= k ? tickets[k] : tickets[k] - 1); } return ans; } diff --git a/solution/2000-2099/2073.Time Needed to Buy Tickets/Solution.go b/solution/2000-2099/2073.Time Needed to Buy Tickets/Solution.go index 3a2df57169c91..5beec9e70c958 100644 --- a/solution/2000-2099/2073.Time Needed to Buy Tickets/Solution.go +++ b/solution/2000-2099/2073.Time Needed to Buy Tickets/Solution.go @@ -1,11 +1,10 @@ -func timeRequiredToBuy(tickets []int, k int) int { - ans := 0 - for i, t := range tickets { - if i <= k { - ans += min(tickets[k], t) - } else { - ans += min(tickets[k]-1, t) +func timeRequiredToBuy(tickets []int, k int) (ans int) { + for i, x := range tickets { + t := tickets[k] + if i > k { + t-- } + ans += min(x, t) } - return ans + return } \ No newline at end of file diff --git a/solution/2000-2099/2073.Time Needed to Buy Tickets/Solution.java b/solution/2000-2099/2073.Time Needed to Buy Tickets/Solution.java index f9c6f7d7394c1..cc09fe2ffcd8a 100644 --- a/solution/2000-2099/2073.Time Needed to Buy Tickets/Solution.java +++ b/solution/2000-2099/2073.Time Needed to Buy Tickets/Solution.java @@ -1,12 +1,8 @@ class Solution { public int timeRequiredToBuy(int[] tickets, int k) { int ans = 0; - for (int i = 0; i < tickets.length; i++) { - if (i <= k) { - ans += Math.min(tickets[k], tickets[i]); - } else { - ans += Math.min(tickets[k] - 1, tickets[i]); - } + for (int i = 0; i < tickets.length; ++i) { + ans += Math.min(tickets[i], i <= k ? tickets[k] : tickets[k] - 1); } return ans; } diff --git a/solution/2000-2099/2073.Time Needed to Buy Tickets/Solution.py b/solution/2000-2099/2073.Time Needed to Buy Tickets/Solution.py index 24344368f33a7..3b70e0f483c8b 100644 --- a/solution/2000-2099/2073.Time Needed to Buy Tickets/Solution.py +++ b/solution/2000-2099/2073.Time Needed to Buy Tickets/Solution.py @@ -1,9 +1,6 @@ class Solution: def timeRequiredToBuy(self, tickets: List[int], k: int) -> int: ans = 0 - for i, t in enumerate(tickets): - if i <= k: - ans += min(tickets[k], t) - else: - ans += min(tickets[k] - 1, t) + for i, x in enumerate(tickets): + ans += min(x, tickets[k] if i <= k else tickets[k] - 1) return ans diff --git a/solution/2000-2099/2073.Time Needed to Buy Tickets/Solution.ts b/solution/2000-2099/2073.Time Needed to Buy Tickets/Solution.ts index dace448f9e08a..bced26d419c00 100644 --- a/solution/2000-2099/2073.Time Needed to Buy Tickets/Solution.ts +++ b/solution/2000-2099/2073.Time Needed to Buy Tickets/Solution.ts @@ -1,23 +1,8 @@ function timeRequiredToBuy(tickets: number[], k: number): number { - const n = tickets.length; - let target = tickets[k] - 1; let ans = 0; - // round1 - for (let i = 0; i < n; i++) { - let num = tickets[i]; - if (num <= target) { - ans += num; - tickets[i] = 0; - } else { - ans += target; - tickets[i] -= target; - } - } - - // round2 - for (let i = 0; i <= k; i++) { - let num = tickets[i]; - ans += num > 0 ? 1 : 0; + const n = tickets.length; + for (let i = 0; i < n; ++i) { + ans += Math.min(tickets[i], i <= k ? tickets[k] : tickets[k] - 1); } return ans; }