Leetcode1093。大規模なサンプル統計

Leetcode1093。大規模なサンプル統計

トピック

我们对 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]

アイデア

  • 最小値と最大値は、最初のカウントが0でなく、最後のカウントが0ではない数値です。
  • 平均、モード、スキャン
  • 中央値は中央の2桁の値を個別に記録できます。中央値を決定する方法は、idx> = cnt / 2-1、idxは現在のスキャンの数、cntは合計桁数です。
  • 最後に、コードは1つのループのみを使用するように最適化できますが、より面倒なので、たくさんのループを使用して記述します。

コード

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