Skip to content

Commit 711ad71

Browse files
authored
feat: update solutions to lc problem: No.2073 (#3209)
No.2073.Time Needed to Buy Tickets
1 parent 01d8b6f commit 711ad71

File tree

7 files changed

+59
-128
lines changed

7 files changed

+59
-128
lines changed

solution/2000-2099/2073.Time Needed to Buy Tickets/README.md

Lines changed: 22 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,13 @@ tags:
6767

6868
<!-- solution:start -->
6969

70-
### 方法一
70+
### 方法一:一次遍历
71+
72+
根据题目描述,当第 $k$ 个人完成购票时,在第 $k$ 个人前面的所有人,购买的票数都不会超过第 $k$ 个人购买的票数,而在第 $k$ 个人后面的所有人,购买的票数都不会超过第 $k$ 个人购买的票数减 $1$。
73+
74+
因此,我们可以遍历整个队伍,对于第 $i$ 个人,如果 $i \leq k$,购票时间为 $\min(\text{tickets}[i], \text{tickets}[k])$,否则购票时间为 $\min(\text{tickets}[i], \text{tickets}[k] - 1)$。我们将所有人的购票时间相加即可。
75+
76+
时间复杂度 $O(n)$,其中 $n$ 为队伍的长度。空间复杂度 $O(1)$。
7177

7278
<!-- tabs:start -->
7379

@@ -77,11 +83,8 @@ tags:
7783
class Solution:
7884
def timeRequiredToBuy(self, tickets: List[int], k: int) -> int:
7985
ans = 0
80-
for i, t in enumerate(tickets):
81-
if i <= k:
82-
ans += min(tickets[k], t)
83-
else:
84-
ans += min(tickets[k] - 1, t)
86+
for i, x in enumerate(tickets):
87+
ans += min(x, tickets[k] if i <= k else tickets[k] - 1)
8588
return ans
8689
```
8790

@@ -91,12 +94,8 @@ class Solution:
9194
class Solution {
9295
public int timeRequiredToBuy(int[] tickets, int k) {
9396
int ans = 0;
94-
for (int i = 0; i < tickets.length; i++) {
95-
if (i <= k) {
96-
ans += Math.min(tickets[k], tickets[i]);
97-
} else {
98-
ans += Math.min(tickets[k] - 1, tickets[i]);
99-
}
97+
for (int i = 0; i < tickets.length; ++i) {
98+
ans += Math.min(tickets[i], i <= k ? tickets[k] : tickets[k] - 1);
10099
}
101100
return ans;
102101
}
@@ -111,11 +110,7 @@ public:
111110
int timeRequiredToBuy(vector<int>& tickets, int k) {
112111
int ans = 0;
113112
for (int i = 0; i < tickets.size(); ++i) {
114-
if (i <= k) {
115-
ans += min(tickets[k], tickets[i]);
116-
} else {
117-
ans += min(tickets[k] - 1, tickets[i]);
118-
}
113+
ans += min(tickets[i], i <= k ? tickets[k] : tickets[k] - 1);
119114
}
120115
return ans;
121116
}
@@ -125,42 +120,26 @@ public:
125120
#### Go
126121
127122
```go
128-
func timeRequiredToBuy(tickets []int, k int) int {
129-
ans := 0
130-
for i, t := range tickets {
131-
if i <= k {
132-
ans += min(tickets[k], t)
133-
} else {
134-
ans += min(tickets[k]-1, t)
123+
func timeRequiredToBuy(tickets []int, k int) (ans int) {
124+
for i, x := range tickets {
125+
t := tickets[k]
126+
if i > k {
127+
t--
135128
}
129+
ans += min(x, t)
136130
}
137-
return ans
131+
return
138132
}
139133
```
140134

141135
#### TypeScript
142136

143137
```ts
144138
function timeRequiredToBuy(tickets: number[], k: number): number {
145-
const n = tickets.length;
146-
let target = tickets[k] - 1;
147139
let ans = 0;
148-
// round1
149-
for (let i = 0; i < n; i++) {
150-
let num = tickets[i];
151-
if (num <= target) {
152-
ans += num;
153-
tickets[i] = 0;
154-
} else {
155-
ans += target;
156-
tickets[i] -= target;
157-
}
158-
}
159-
160-
// round2
161-
for (let i = 0; i <= k; i++) {
162-
let num = tickets[i];
163-
ans += num > 0 ? 1 : 0;
140+
const n = tickets.length;
141+
for (let i = 0; i < n; ++i) {
142+
ans += Math.min(tickets[i], i <= k ? tickets[k] : tickets[k] - 1);
164143
}
165144
return ans;
166145
}

solution/2000-2099/2073.Time Needed to Buy Tickets/README_EN.md

Lines changed: 22 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,13 @@ The person at&nbsp;position 0 has successfully bought 5 tickets and it took 4 +
6767

6868
<!-- solution:start -->
6969

70-
### Solution 1
70+
### Solution 1: Single Pass
71+
72+
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$.
73+
74+
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.
75+
76+
The time complexity is $O(n)$, where $n$ is the length of the queue. The space complexity is $O(1)$.
7177

7278
<!-- tabs:start -->
7379

@@ -77,11 +83,8 @@ The person at&nbsp;position 0 has successfully bought 5 tickets and it took 4 +
7783
class Solution:
7884
def timeRequiredToBuy(self, tickets: List[int], k: int) -> int:
7985
ans = 0
80-
for i, t in enumerate(tickets):
81-
if i <= k:
82-
ans += min(tickets[k], t)
83-
else:
84-
ans += min(tickets[k] - 1, t)
86+
for i, x in enumerate(tickets):
87+
ans += min(x, tickets[k] if i <= k else tickets[k] - 1)
8588
return ans
8689
```
8790

@@ -91,12 +94,8 @@ class Solution:
9194
class Solution {
9295
public int timeRequiredToBuy(int[] tickets, int k) {
9396
int ans = 0;
94-
for (int i = 0; i < tickets.length; i++) {
95-
if (i <= k) {
96-
ans += Math.min(tickets[k], tickets[i]);
97-
} else {
98-
ans += Math.min(tickets[k] - 1, tickets[i]);
99-
}
97+
for (int i = 0; i < tickets.length; ++i) {
98+
ans += Math.min(tickets[i], i <= k ? tickets[k] : tickets[k] - 1);
10099
}
101100
return ans;
102101
}
@@ -111,11 +110,7 @@ public:
111110
int timeRequiredToBuy(vector<int>& tickets, int k) {
112111
int ans = 0;
113112
for (int i = 0; i < tickets.size(); ++i) {
114-
if (i <= k) {
115-
ans += min(tickets[k], tickets[i]);
116-
} else {
117-
ans += min(tickets[k] - 1, tickets[i]);
118-
}
113+
ans += min(tickets[i], i <= k ? tickets[k] : tickets[k] - 1);
119114
}
120115
return ans;
121116
}
@@ -125,42 +120,26 @@ public:
125120
#### Go
126121
127122
```go
128-
func timeRequiredToBuy(tickets []int, k int) int {
129-
ans := 0
130-
for i, t := range tickets {
131-
if i <= k {
132-
ans += min(tickets[k], t)
133-
} else {
134-
ans += min(tickets[k]-1, t)
123+
func timeRequiredToBuy(tickets []int, k int) (ans int) {
124+
for i, x := range tickets {
125+
t := tickets[k]
126+
if i > k {
127+
t--
135128
}
129+
ans += min(x, t)
136130
}
137-
return ans
131+
return
138132
}
139133
```
140134

141135
#### TypeScript
142136

143137
```ts
144138
function timeRequiredToBuy(tickets: number[], k: number): number {
145-
const n = tickets.length;
146-
let target = tickets[k] - 1;
147139
let ans = 0;
148-
// round1
149-
for (let i = 0; i < n; i++) {
150-
let num = tickets[i];
151-
if (num <= target) {
152-
ans += num;
153-
tickets[i] = 0;
154-
} else {
155-
ans += target;
156-
tickets[i] -= target;
157-
}
158-
}
159-
160-
// round2
161-
for (let i = 0; i <= k; i++) {
162-
let num = tickets[i];
163-
ans += num > 0 ? 1 : 0;
140+
const n = tickets.length;
141+
for (let i = 0; i < n; ++i) {
142+
ans += Math.min(tickets[i], i <= k ? tickets[k] : tickets[k] - 1);
164143
}
165144
return ans;
166145
}

solution/2000-2099/2073.Time Needed to Buy Tickets/Solution.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,7 @@ class Solution {
33
int timeRequiredToBuy(vector<int>& tickets, int k) {
44
int ans = 0;
55
for (int i = 0; i < tickets.size(); ++i) {
6-
if (i <= k) {
7-
ans += min(tickets[k], tickets[i]);
8-
} else {
9-
ans += min(tickets[k] - 1, tickets[i]);
10-
}
6+
ans += min(tickets[i], i <= k ? tickets[k] : tickets[k] - 1);
117
}
128
return ans;
139
}
Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
func timeRequiredToBuy(tickets []int, k int) int {
2-
ans := 0
3-
for i, t := range tickets {
4-
if i <= k {
5-
ans += min(tickets[k], t)
6-
} else {
7-
ans += min(tickets[k]-1, t)
1+
func timeRequiredToBuy(tickets []int, k int) (ans int) {
2+
for i, x := range tickets {
3+
t := tickets[k]
4+
if i > k {
5+
t--
86
}
7+
ans += min(x, t)
98
}
10-
return ans
9+
return
1110
}

solution/2000-2099/2073.Time Needed to Buy Tickets/Solution.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
class Solution {
22
public int timeRequiredToBuy(int[] tickets, int k) {
33
int ans = 0;
4-
for (int i = 0; i < tickets.length; i++) {
5-
if (i <= k) {
6-
ans += Math.min(tickets[k], tickets[i]);
7-
} else {
8-
ans += Math.min(tickets[k] - 1, tickets[i]);
9-
}
4+
for (int i = 0; i < tickets.length; ++i) {
5+
ans += Math.min(tickets[i], i <= k ? tickets[k] : tickets[k] - 1);
106
}
117
return ans;
128
}
Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
class Solution:
22
def timeRequiredToBuy(self, tickets: List[int], k: int) -> int:
33
ans = 0
4-
for i, t in enumerate(tickets):
5-
if i <= k:
6-
ans += min(tickets[k], t)
7-
else:
8-
ans += min(tickets[k] - 1, t)
4+
for i, x in enumerate(tickets):
5+
ans += min(x, tickets[k] if i <= k else tickets[k] - 1)
96
return ans
Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,8 @@
11
function timeRequiredToBuy(tickets: number[], k: number): number {
2-
const n = tickets.length;
3-
let target = tickets[k] - 1;
42
let ans = 0;
5-
// round1
6-
for (let i = 0; i < n; i++) {
7-
let num = tickets[i];
8-
if (num <= target) {
9-
ans += num;
10-
tickets[i] = 0;
11-
} else {
12-
ans += target;
13-
tickets[i] -= target;
14-
}
15-
}
16-
17-
// round2
18-
for (let i = 0; i <= k; i++) {
19-
let num = tickets[i];
20-
ans += num > 0 ? 1 : 0;
3+
const n = tickets.length;
4+
for (let i = 0; i < n; ++i) {
5+
ans += Math.min(tickets[i], i <= k ? tickets[k] : tickets[k] - 1);
216
}
227
return ans;
238
}

0 commit comments

Comments
 (0)