From 43bb59a7fda5b2f6e9a8bd5a55ec974abf9a9569 Mon Sep 17 00:00:00 2001 From: Azureki Date: Fri, 28 Jun 2019 15:56:25 +0800 Subject: [PATCH] python implementation --- 1093._Statistics_from_a_Large_Sample/main.py | 34 ++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 1093._Statistics_from_a_Large_Sample/main.py diff --git a/1093._Statistics_from_a_Large_Sample/main.py b/1093._Statistics_from_a_Large_Sample/main.py new file mode 100644 index 0000000..7ab1f63 --- /dev/null +++ b/1093._Statistics_from_a_Large_Sample/main.py @@ -0,0 +1,34 @@ +from bisect import bisect_left + + +class Solution: + def sampleStats(self, count: List[int]) -> List[float]: + mode = count.index(max(count)) + min_v, max_v = 0, 0 + for i, x in enumerate(count): + if x != 0: + min_v = i + break + for i in range(len(count) - 1, -1, -1): + if count[i] != 0: + max_v = i + break + SUM, num = 0, 0 + for i, x in enumerate(count): + SUM += i * x + num += x + + count_sum = count[:] + for i in range(1, len(count_sum)): + count_sum[i] = count_sum[i] + count_sum[i - 1] + + is_odd = lambda x: x & 1 + mid = bisect_left(count_sum, num // 2) + if is_odd(num): + median = mid + elif count_sum[mid] != num // 2: + median = mid + else: + mid_next = bisect_left(count_sum, num // 2 + 1) + median = (mid + mid_next) / 2 + return (min_v, max_v, SUM / num, median, mode)