Skip to content

Commit dc9ce3b

Browse files
committed
feat: add solutions to lc problem: No.1093
No.1093.Statistics from a Large Sample
1 parent ead50fd commit dc9ce3b

File tree

15 files changed

+522
-46
lines changed

15 files changed

+522
-46
lines changed

solution/1000-1099/1091.Shortest Path in Binary Matrix/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ function shortestPathBinaryMatrix(grid: number[][]): number {
229229
q = nq;
230230
}
231231
return -1;
232-
};
232+
}
233233
```
234234

235235
### **Rust**

solution/1000-1099/1091.Shortest Path in Binary Matrix/README_EN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ function shortestPathBinaryMatrix(grid: number[][]): number {
207207
q = nq;
208208
}
209209
return -1;
210-
};
210+
}
211211
```
212212

213213
### **Rust**

solution/1000-1099/1093.Statistics from a Large Sample/README.md

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,22 +65,216 @@
6565

6666
<!-- 这里可写通用的实现逻辑 -->
6767

68+
**方法一:模拟**
69+
70+
我们直接根据题目描述模拟即可,定义以下变量:
71+
72+
- 变量 $mi$ 表示最小值;
73+
- 变量 $mx$ 表示最大值;
74+
- 变量 $s$ 表示总和;
75+
- 变量 $cnt$ 表示总个数;
76+
- 变量 $mode$ 表示众数。
77+
78+
我们遍历数组 $count$,对于当前遍历到的数字 $count[k]$,如果 $count[k] \gt 0$,那么我们做以下更新操作:
79+
80+
- 更新 $mi = \min(mi, k)$;
81+
- 更新 $mx = \max(mx, k)$;
82+
- 更新 $s = s + k \times count[k]$;
83+
- 更新 $cnt = cnt + count[k]$;
84+
- 如果 $count[k] \gt count[mode]$,那么更新 $mode = k$。
85+
86+
遍历结束后,我们再根据 $cnt$ 的奇偶性来更新中位数 $median$,如果 $cnt$ 是奇数,那么中位数就是第 $\lfloor \frac{cnt}{2} \rfloor + 1$ 个数字,如果 $cnt$ 是偶数,那么中位数就是第 $\lfloor \frac{cnt}{2} \rfloor$ 和第 $\lfloor \frac{cnt}{2} \rfloor + 1$ 个数字的平均值。
87+
88+
最后,我们将 $mi, mx, \frac{s}{cnt}, median, mode$ 放入答案数组中返回即可。
89+
90+
时间复杂度 $O(n)$,其中 $n$ 是数组 $count$ 的长度。空间复杂度 $O(1)$。
91+
6892
<!-- tabs:start -->
6993

7094
### **Python3**
7195

7296
<!-- 这里可写当前语言的特殊实现逻辑 -->
7397

7498
```python
99+
class Solution:
100+
def sampleStats(self, count: List[int]) -> List[float]:
101+
def find(i: int) -> int:
102+
t = 0
103+
for k, x in enumerate(count):
104+
t += x
105+
if t >= i:
106+
return k
107+
108+
mi, mx = inf, -1
109+
s = cnt = 0
110+
mode = 0
111+
for k, x in enumerate(count):
112+
if x:
113+
mi = min(mi, k)
114+
mx = max(mx, k)
115+
s += k * x
116+
cnt += x
117+
if x > count[mode]:
118+
mode = k
75119

120+
median = (
121+
find(cnt // 2 + 1) if cnt & 1 else (find(cnt // 2) + find(cnt // 2 + 1)) / 2
122+
)
123+
return [mi, mx, s / cnt, median, mode]
76124
```
77125

78126
### **Java**
79127

80128
<!-- 这里可写当前语言的特殊实现逻辑 -->
81129

82130
```java
131+
class Solution {
132+
private int[] count;
133+
134+
public double[] sampleStats(int[] count) {
135+
this.count = count;
136+
int mi = 1 << 30, mx = -1;
137+
long s = 0;
138+
int cnt = 0;
139+
int mode = 0;
140+
for (int k = 0; k < count.length; ++k) {
141+
if (count[k] > 0) {
142+
mi = Math.min(mi, k);
143+
mx = Math.max(mx, k);
144+
s += 1L * k * count[k];
145+
cnt += count[k];
146+
if (count[k] > count[mode]) {
147+
mode = k;
148+
}
149+
}
150+
}
151+
double median = cnt % 2 == 1 ? find(cnt / 2 + 1) : (find(cnt / 2) + find(cnt / 2 + 1)) / 2.0;
152+
return new double[]{mi, mx, s * 1.0 / cnt, median, mode};
153+
}
154+
155+
private int find(int i) {
156+
for (int k = 0, t = 0;; ++k) {
157+
t += count[k];
158+
if (t >= i) {
159+
return k;
160+
}
161+
}
162+
}
163+
}
164+
```
165+
166+
### **C++**
167+
168+
```cpp
169+
class Solution {
170+
public:
171+
vector<double> sampleStats(vector<int>& count) {
172+
auto find = [&](int i) -> int {
173+
for (int k = 0, t = 0;; ++k) {
174+
t += count[k];
175+
if (t >= i) {
176+
return k;
177+
}
178+
}
179+
};
180+
int mi = 1 << 30, mx = -1;
181+
long long s = 0;
182+
int cnt = 0, mode = 0;
183+
for (int k = 0; k < count.size(); ++k) {
184+
if (count[k]) {
185+
mi = min(mi, k);
186+
mx = max(mx, k);
187+
s += 1LL * k * count[k];
188+
cnt += count[k];
189+
if (count[k] > count[mode]) {
190+
mode = k;
191+
}
192+
}
193+
}
194+
double median = cnt % 2 == 1 ? find(cnt / 2 + 1) : (find(cnt / 2) + find(cnt / 2 + 1)) / 2.0;
195+
return vector<double>{(double) mi, (double) mx, s * 1.0 / cnt, median, (double) mode};
196+
}
197+
};
198+
```
199+
200+
### **Go**
201+
202+
```go
203+
func sampleStats(count []int) []float64 {
204+
find := func(i int) int {
205+
for k, t := 0, 0; ; k++ {
206+
t += count[k]
207+
if t >= i {
208+
return k
209+
}
210+
}
211+
}
212+
mi, mx := 1<<30, -1
213+
s, cnt, mode := 0, 0, 0
214+
for k, x := range count {
215+
if x > 0 {
216+
mi = min(mi, k)
217+
mx = max(mx, k)
218+
s += k * x
219+
cnt += x
220+
if x > count[mode] {
221+
mode = k
222+
}
223+
}
224+
}
225+
var median float64
226+
if cnt&1 == 1 {
227+
median = float64(find(cnt/2 + 1))
228+
} else {
229+
median = float64(find(cnt/2)+find(cnt/2+1)) / 2
230+
}
231+
return []float64{float64(mi), float64(mx), float64(s) / float64(cnt), median, float64(mode)}
232+
}
233+
234+
func min(a, b int) int {
235+
if a < b {
236+
return a
237+
}
238+
return b
239+
}
240+
241+
func max(a, b int) int {
242+
if a > b {
243+
return a
244+
}
245+
return b
246+
}
247+
```
248+
249+
### **TypeScript**
83250

251+
```ts
252+
function sampleStats(count: number[]): number[] {
253+
const find = (i: number): number => {
254+
for (let k = 0, t = 0; ; ++k) {
255+
t += count[k];
256+
if (t >= i) {
257+
return k;
258+
}
259+
}
260+
}
261+
let mi = 1 << 30;
262+
let mx = -1;
263+
let [s, cnt, mode] = [0, 0, 0];
264+
for (let k = 0; k < count.length; ++k) {
265+
if (count[k] > 0) {
266+
mi = Math.min(mi, k);
267+
mx = Math.max(mx, k);
268+
s += k * count[k];
269+
cnt += count[k];
270+
if (count[k] > count[mode]) {
271+
mode = k;
272+
}
273+
}
274+
}
275+
const median = cnt % 2 === 1 ? find((cnt >> 1) + 1) : (find(cnt >> 1) + find((cnt >> 1) + 1)) / 2;
276+
return [mi, mx, s / cnt, median, mode];
277+
};
84278
```
85279

86280
### **...**

0 commit comments

Comments
 (0)