49
49
50
50
### 方法一:滑动窗口
51
51
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)$。
53
59
54
60
<!-- tabs:start -->
55
61
@@ -58,36 +64,32 @@ class Solution:
58
64
def maxSatisfied (
59
65
self , customers : List[int ], grumpy : List[int ], minutes : int
60
66
) -> 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
70
73
```
71
74
72
75
``` java
73
76
class Solution {
74
77
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 ) ;
80
83
}
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 );
89
91
}
90
- return ans ;
92
+ return tot + mx ;
91
93
}
92
94
}
93
95
```
@@ -96,76 +98,80 @@ class Solution {
96
98
class Solution {
97
99
public:
98
100
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) ;
104
106
}
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);
113
114
}
114
- return ans ;
115
+ return tot + mx ;
115
116
}
116
117
};
117
118
```
118
119
119
120
```go
120
121
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)
125
126
}
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)
134
133
}
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 ;
136
153
}
137
154
```
138
155
139
156
``` rust
140
157
impl Solution {
141
158
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 ]);
160
165
}
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 ]);
167
173
}
168
- sum + max
174
+ tot + mx
169
175
}
170
176
}
171
177
```
0 commit comments