Leetcode 1093. 大样本统计

Leetcode 1093. 大样本统计

题目

我们对 0 到 255 之间的整数进行采样,并将结果存储在数组 count 中:count[k] 就是整数 k 的采样个数。

我们以 浮点数 数组的形式,分别返回样本的最小值、最大值、平均值、中位数和众数。其中,众数是保证唯一的。

我们先来回顾一下中位数的知识:

如果样本中的元素有序,并且元素数量为奇数时,中位数为最中间的那个元素;
如果样本中的元素有序,并且元素数量为偶数时,中位数为中间的两个元素的平均值。

示例 1:

输入:count = [0,1,3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
输出:[1.00000,3.00000,2.37500,2.50000,3.00000]

示例 2:

输入:count = [0,4,3,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
输出:[1.00000,4.00000,2.18182,2.00000,1.00000]

思路

  • 最小值, 最大值就是看第一个count不是0和最后一个count不是0的数字
  • 平均数, 众数一边扫描即可
  • 中位数可以分别记录中间2个数字的数值, 判断到中间的方法为idx >= cnt / 2 - 1, idx为当前扫描的个数, cnt为总共多少个数字
  • 最后说一句, 其实代码可以优化到只用一个循环, 但是比较麻烦所以就用了一堆循环来写

代码

class Solution:
    def sampleStats(self, count):
        res, length = [], len(count)

        # 最小值
        for i in range(length):
            if count[i] != 0:
                res.append(float(i))
                break

        # 最大值
        for i in range(length - 1, -1, -1):
            if count[i] != 0:
                res.append(float(i))
                break

        # 平均值, 众数
        sum, cnt, mode_cnt, mode = 0, 0, 0, 0

        for i in range(length):
            sum = sum + i * count[i]
            cnt = cnt + count[i]

            if count[i] > mode_cnt:
                mode_cnt = count[i]
                mode = i

        # 中位数
        idx, middle_1, middle_2 = -1, -1, -1

        for i in range(length):
            if count[i] != 0:
                idx = idx + count[i]

                if idx >= cnt / 2 - 1:
                    if middle_1 == -1:
                        middle_1 = i
                        
                if idx >= cnt / 2:
                    if middle_2 == -1:
                        middle_2 = i
                        break

        middle = (middle_1 + middle_2) / 2 if cnt % 2 == 0 else middle_2

        res.extend([sum / cnt, middle, mode])
        return res

猜你喜欢

转载自blog.csdn.net/weixin_43891775/article/details/112859421