58
58
59
59
<!-- 这里可写通用的实现逻辑 -->
60
60
61
+ ** 方法一:遍历**
62
+
63
+ 我们直接遍历数组 $nums$,对于每个下标 $i$,维护前 $i + 1$ 个元素的和 $pre$ 和后 $n - i - 1$ 个元素的和 $suf$,计算平均差的绝对值 $t$,如果 $t$ 小于当前最小值 $mi$,则更新答案 $ans = i$ 和最小值 $mi = t$。
64
+
65
+ 遍历结束后,返回答案即可。
66
+
67
+ 时间复杂度 $O(n)$,其中 $n$ 是数组 $nums$ 的长度。空间复杂度 $O(1)$。
68
+
61
69
<!-- tabs:start -->
62
70
63
71
### ** Python3**
67
75
``` python
68
76
class Solution :
69
77
def minimumAverageDifference (self , nums : List[int ]) -> int :
70
- s = list (accumulate(nums))
71
- ans, n = 0 , len (nums)
72
- mi = inf
73
- for i in range (n):
74
- a = s[i] // (i + 1 )
75
- b = 0 if i == n - 1 else (s[- 1 ] - s[i]) // (n - i - 1 )
76
- t = abs (a - b)
77
- if mi > t:
78
+ pre, suf = 0 , sum (nums)
79
+ n = len (nums)
80
+ ans, mi = 0 , inf
81
+ for i, x in enumerate (nums):
82
+ pre += x
83
+ suf -= x
84
+ a = pre // (i + 1 )
85
+ b = 0 if n - i - 1 == 0 else suf // (n - i - 1 )
86
+ if (t := abs (a - b)) < mi:
78
87
ans = i
79
88
mi = t
80
89
return ans
@@ -88,18 +97,19 @@ class Solution:
88
97
class Solution {
89
98
public int minimumAverageDifference (int [] nums ) {
90
99
int n = nums. length;
91
- long [] s = new long [n];
92
- s[0 ] = nums[0 ];
93
- for (int i = 1 ; i < n; ++ i) {
94
- s[i] = s[i - 1 ] + nums[i];
100
+ long pre = 0 , suf = 0 ;
101
+ for (int x : nums) {
102
+ suf += x;
95
103
}
96
104
int ans = 0 ;
97
105
long mi = Long . MAX_VALUE ;
98
106
for (int i = 0 ; i < n; ++ i) {
99
- long a = s[i] / (i + 1 );
100
- long b = i == n - 1 ? 0 : (s[n - 1 ] - s[i]) / (n - i - 1 );
107
+ pre += nums[i];
108
+ suf -= nums[i];
109
+ long a = pre / (i + 1 );
110
+ long b = n - i - 1 == 0 ? 0 : suf / (n - i - 1 );
101
111
long t = Math . abs(a - b);
102
- if (mi > t ) {
112
+ if (t < mi ) {
103
113
ans = i;
104
114
mi = t;
105
115
}
@@ -112,22 +122,22 @@ class Solution {
112
122
### ** C++**
113
123
114
124
``` cpp
115
- typedef long long ll;
116
-
117
125
class Solution {
118
126
public:
119
127
int minimumAverageDifference(vector<int >& nums) {
120
128
int n = nums.size();
121
- vector< ll > s(n) ;
122
- s [ 0 ] = nums [ 0 ] ;
123
- for (int i = 1; i < n; ++i) s [ i ] = s [ i - 1 ] + nums[ i ] ;
129
+ using ll = long long ;
130
+ ll pre = 0 ;
131
+ ll suf = accumulate(nums.begin(), nums.end(), 0LL) ;
124
132
int ans = 0;
125
- ll mi = LONG_MAX ;
133
+ ll mi = suf ;
126
134
for (int i = 0; i < n; ++i) {
127
- ll a = s[ i] / (i + 1);
128
- ll b = i == n - 1 ? 0 : (s[ n - 1] - s[ i] ) / (n - i - 1);
135
+ pre += nums[ i] ;
136
+ suf -= nums[ i] ;
137
+ ll a = pre / (i + 1);
138
+ ll b = n - i - 1 == 0 ? 0 : suf / (n - i - 1);
129
139
ll t = abs(a - b);
130
- if (mi > t ) {
140
+ if (t < mi ) {
131
141
ans = i;
132
142
mi = t;
133
143
}
@@ -140,28 +150,27 @@ public:
140
150
### **Go**
141
151
142
152
```go
143
- func minimumAverageDifference(nums []int) int {
153
+ func minimumAverageDifference(nums []int) (ans int) {
144
154
n := len(nums)
145
- s := make([]int, n)
146
- s[0] = nums[0]
147
- for i := 1; i < n; i++ {
148
- s[i] = s[i-1] + nums[i]
155
+ pre, suf := 0, 0
156
+ for _, x := range nums {
157
+ suf += x
149
158
}
150
- ans := 0
151
- mi := math.MaxInt32
152
- for i := 0; i < n; i++ {
153
- a := s[i] / (i + 1)
159
+ mi := suf
160
+ for i, x := range nums {
161
+ pre += x
162
+ suf -= x
163
+ a := pre / (i + 1)
154
164
b := 0
155
- if i != n-1 {
156
- b = (s[n-1] - s[i]) / (n - i - 1)
165
+ if n-i-1 != 0 {
166
+ b = suf / (n - i - 1)
157
167
}
158
- t := abs(a - b)
159
- if mi > t {
168
+ if t := abs(a - b); t < mi {
160
169
ans = i
161
170
mi = t
162
171
}
163
172
}
164
- return ans
173
+ return
165
174
}
166
175
167
176
func abs(x int) int {
@@ -175,7 +184,25 @@ func abs(x int) int {
175
184
### ** TypeScript**
176
185
177
186
``` ts
178
-
187
+ function minimumAverageDifference(nums : number []): number {
188
+ const n = nums .length ;
189
+ let pre = 0 ;
190
+ let suf = nums .reduce ((a , b ) => a + b );
191
+ let ans = 0 ;
192
+ let mi = suf ;
193
+ for (let i = 0 ; i < n ; ++ i ) {
194
+ pre += nums [i ];
195
+ suf -= nums [i ];
196
+ const a = Math .floor (pre / (i + 1 ));
197
+ const b = n - i - 1 === 0 ? 0 : Math .floor (suf / (n - i - 1 ));
198
+ const t = Math .abs (a - b );
199
+ if (t < mi ) {
200
+ ans = i ;
201
+ mi = t ;
202
+ }
203
+ }
204
+ return ans ;
205
+ }
179
206
```
180
207
181
208
### ** ...**
0 commit comments