Skip to content

Commit 05495d1

Browse files
authored
feat: add solutions to lc problem: No.1052 (doocs#2559)
1 parent 6bee023 commit 05495d1

File tree

16 files changed

+298
-261
lines changed

16 files changed

+298
-261
lines changed

lcci/01.02.Check Permutation/README_EN.md

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,33 @@ var CheckPermutation = function (s1, s2) {
176176
};
177177
```
178178

179+
```swift
180+
class Solution {
181+
func CheckPermutation(_ s1: String, _ s2: String) -> Bool {
182+
if s1.count != s2.count {
183+
return false
184+
}
185+
186+
var cnt = Array(repeating: 0, count: 26)
187+
188+
for char in s1 {
189+
let index = Int(char.asciiValue! - Character("a").asciiValue!)
190+
cnt[index] += 1
191+
}
192+
193+
for char in s2 {
194+
let index = Int(char.asciiValue! - Character("a").asciiValue!)
195+
cnt[index] -= 1
196+
if cnt[index] < 0 {
197+
return false
198+
}
199+
}
200+
201+
return true
202+
}
203+
}
204+
```
205+
179206
<!-- tabs:end -->
180207

181208
### Solution 2: Sorting
@@ -242,33 +269,6 @@ impl Solution {
242269
}
243270
```
244271

245-
```swift
246-
class Solution {
247-
func CheckPermutation(_ s1: String, _ s2: String) -> Bool {
248-
if s1.count != s2.count {
249-
return false
250-
}
251-
252-
var cnt = Array(repeating: 0, count: 26)
253-
254-
for char in s1 {
255-
let index = Int(char.asciiValue! - Character("a").asciiValue!)
256-
cnt[index] += 1
257-
}
258-
259-
for char in s2 {
260-
let index = Int(char.asciiValue! - Character("a").asciiValue!)
261-
cnt[index] -= 1
262-
if cnt[index] < 0 {
263-
return false
264-
}
265-
}
266-
267-
return true
268-
}
269-
}
270-
```
271-
272272
<!-- tabs:end -->
273273

274274
<!-- end -->

solution/1000-1099/1052.Grumpy Bookstore Owner/README.md

Lines changed: 82 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,13 @@
4949

5050
### 方法一:滑动窗口
5151

52-
定义 $s$ 表示所有不满意的顾客总数,$cs$ 表示顾客总数。
52+
根据题目描述,我们只需要统计老板不生气时的客户数量 $tot$,再加上一个大小为 `minutes` 的滑动窗口中,老板生气时的客户数量的最大值 $mx$ 即可。
53+
54+
我们定义一个变量 $cnt$ 来记录滑动窗口中老板生气时的客户数量,初始值为前 `minutes` 分钟老板生气时的客户数量。然后我们遍历数组,每次移动滑动窗口时,更新 $cnt$ 的值,同时更新 $mx$ 的值。
55+
56+
最后返回 $tot + mx$ 即可。
57+
58+
时间复杂度 $O(n)$,其中 $n$ 为数组 `customers` 的长度。空间复杂度 $O(1)$。
5359

5460
<!-- tabs:start -->
5561

@@ -58,36 +64,32 @@ class Solution:
5864
def maxSatisfied(
5965
self, customers: List[int], grumpy: List[int], minutes: int
6066
) -> int:
61-
s = sum(a * b for a, b in zip(customers, grumpy))
62-
cs = sum(customers)
63-
t = ans = 0
64-
for i, (a, b) in enumerate(zip(customers, grumpy), 1):
65-
t += a * b
66-
if (j := i - minutes) >= 0:
67-
ans = max(ans, cs - (s - t))
68-
t -= customers[j] * grumpy[j]
69-
return ans
67+
mx = cnt = sum(c * g for c, g in zip(customers[:minutes], grumpy))
68+
for i in range(minutes, len(customers)):
69+
cnt += customers[i] * grumpy[i]
70+
cnt -= customers[i - minutes] * grumpy[i - minutes]
71+
mx = max(mx, cnt)
72+
return sum(c * (g ^ 1) for c, g in zip(customers, grumpy)) + mx
7073
```
7174

7275
```java
7376
class Solution {
7477
public int maxSatisfied(int[] customers, int[] grumpy, int minutes) {
75-
int s = 0, cs = 0;
76-
int n = customers.length;
77-
for (int i = 0; i < n; ++i) {
78-
s += customers[i] * grumpy[i];
79-
cs += customers[i];
78+
int cnt = 0;
79+
int tot = 0;
80+
for (int i = 0; i < minutes; ++i) {
81+
cnt += customers[i] * grumpy[i];
82+
tot += customers[i] * (grumpy[i] ^ 1);
8083
}
81-
int t = 0, ans = 0;
82-
for (int i = 0; i < n; ++i) {
83-
t += customers[i] * grumpy[i];
84-
int j = i - minutes + 1;
85-
if (j >= 0) {
86-
ans = Math.max(ans, cs - (s - t));
87-
t -= customers[j] * grumpy[j];
88-
}
84+
int mx = cnt;
85+
int n = customers.length;
86+
for (int i = minutes; i < n; ++i) {
87+
cnt += customers[i] * grumpy[i];
88+
cnt -= customers[i - minutes] * grumpy[i - minutes];
89+
mx = Math.max(mx, cnt);
90+
tot += customers[i] * (grumpy[i] ^ 1);
8991
}
90-
return ans;
92+
return tot + mx;
9193
}
9294
}
9395
```
@@ -96,76 +98,80 @@ class Solution {
9698
class Solution {
9799
public:
98100
int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int minutes) {
99-
int s = 0, cs = 0;
100-
int n = customers.size();
101-
for (int i = 0; i < n; ++i) {
102-
s += customers[i] * grumpy[i];
103-
cs += customers[i];
101+
int cnt = 0;
102+
int tot = 0;
103+
for (int i = 0; i < minutes; ++i) {
104+
cnt += customers[i] * grumpy[i];
105+
tot += customers[i] * (grumpy[i] ^ 1);
104106
}
105-
int t = 0, ans = 0;
106-
for (int i = 0; i < n; ++i) {
107-
t += customers[i] * grumpy[i];
108-
int j = i - minutes + 1;
109-
if (j >= 0) {
110-
ans = max(ans, cs - (s - t));
111-
t -= customers[j] * grumpy[j];
112-
}
107+
int mx = cnt;
108+
int n = customers.size();
109+
for (int i = minutes; i < n; ++i) {
110+
cnt += customers[i] * grumpy[i];
111+
cnt -= customers[i - minutes] * grumpy[i - minutes];
112+
mx = max(mx, cnt);
113+
tot += customers[i] * (grumpy[i] ^ 1);
113114
}
114-
return ans;
115+
return tot + mx;
115116
}
116117
};
117118
```
118119
119120
```go
120121
func maxSatisfied(customers []int, grumpy []int, minutes int) int {
121-
s, cs := 0, 0
122-
for i, c := range customers {
123-
s += c * grumpy[i]
124-
cs += c
122+
var cnt, tot int
123+
for i, c := range customers[:minutes] {
124+
cnt += c * grumpy[i]
125+
tot += c * (grumpy[i] ^ 1)
125126
}
126-
t, ans := 0, 0
127-
for i, c := range customers {
128-
t += c * grumpy[i]
129-
j := i - minutes + 1
130-
if j >= 0 {
131-
ans = max(ans, cs-(s-t))
132-
t -= customers[j] * grumpy[j]
133-
}
127+
mx := cnt
128+
for i := minutes; i < len(customers); i++ {
129+
cnt += customers[i] * grumpy[i]
130+
cnt -= customers[i-minutes] * grumpy[i-minutes]
131+
mx = max(mx, cnt)
132+
tot += customers[i] * (grumpy[i] ^ 1)
134133
}
135-
return ans
134+
return tot + mx
135+
}
136+
```
137+
138+
```ts
139+
function maxSatisfied(customers: number[], grumpy: number[], minutes: number): number {
140+
let [cnt, tot] = [0, 0];
141+
for (let i = 0; i < minutes; ++i) {
142+
cnt += customers[i] * grumpy[i];
143+
tot += customers[i] * (grumpy[i] ^ 1);
144+
}
145+
let mx = cnt;
146+
for (let i = minutes; i < customers.length; ++i) {
147+
cnt += customers[i] * grumpy[i];
148+
cnt -= customers[i - minutes] * grumpy[i - minutes];
149+
mx = Math.max(mx, cnt);
150+
tot += customers[i] * (grumpy[i] ^ 1);
151+
}
152+
return tot + mx;
136153
}
137154
```
138155

139156
```rust
140157
impl Solution {
141158
pub fn max_satisfied(customers: Vec<i32>, grumpy: Vec<i32>, minutes: i32) -> i32 {
142-
let k = minutes as usize;
143-
let n = customers.len();
144-
145-
let mut sum = 0;
146-
for i in 0..k {
147-
if grumpy[i] == 1 {
148-
sum += customers[i];
149-
}
150-
}
151-
let mut max = sum;
152-
for i in k..n {
153-
if grumpy[i - k] == 1 {
154-
sum -= customers[i - k];
155-
}
156-
if grumpy[i] == 1 {
157-
sum += customers[i];
158-
}
159-
max = max.max(sum);
159+
let mut cnt = 0;
160+
let mut tot = 0;
161+
let minutes = minutes as usize;
162+
for i in 0..minutes {
163+
cnt += customers[i] * grumpy[i];
164+
tot += customers[i] * (1 - grumpy[i]);
160165
}
161-
162-
sum = 0;
163-
for i in 0..n {
164-
if grumpy[i] == 0 {
165-
sum += customers[i];
166-
}
166+
let mut mx = cnt;
167+
let n = customers.len();
168+
for i in minutes..n {
169+
cnt += customers[i] * grumpy[i];
170+
cnt -= customers[i - minutes] * grumpy[i - minutes];
171+
mx = mx.max(cnt);
172+
tot += customers[i] * (1 - grumpy[i]);
167173
}
168-
sum + max
174+
tot + mx
169175
}
170176
}
171177
```

0 commit comments

Comments
 (0)