1093. Statistics from a Large Sample

class Solution {
    public double[] sampleStats(int[] count) {
        double min = -1;
        double max = -1;
        double mean = 0;
        double median = 0;
        double mode = 0;

        //min
        for(int i = 0; i < 256; ++i){
            if(count[i] != 0){
                min = i;
                break;
            }
        }

        //max
        for(int i = 255; i >= 0; --i){
            if(count[i] != 0){
                max = i;
                break;
            }
        }

        //mean
        List<int[]> mem_List = new ArrayList<>();
        double sum = 0;
        int sum_size = 0;
        int val_mode = -1;
        for(int i = 0; i < 256; ++i){
            if(count[i] != 0){
                int[] temp_int = {i, count[i]};
                mem_List.add(temp_int);
                sum += i * count[i];
                sum_size += count[i];
            }
            if(count[i] > val_mode){
                val_mode = count[i];
                mode = i;
            }
        }
        mean = sum / sum_size;

        //median
        if(sum_size % 2 == 0){
            int mid_index1 = sum_size / 2;
            int mid_index2 = sum_size / 2 + 1;
            int temp_sum = 0;

            for(int i = 0; i < mem_List.size(); ++i){
                temp_sum += mem_List.get(i)[1];
                if(temp_sum >= mid_index2){
                    median = mem_List.get(i)[0];
                    break;
                }else if(temp_sum == mid_index1){
                    median = (double)(mem_List.get(i)[0] + mem_List.get(i + 1)[0]) / 2;
                    break;
                }
            }
        }else{
            int mid_index = sum_size / 2 + 1;
            int temp_sum = 0;
            for(int i = 0; i < mem_List.size(); ++i){
                temp_sum += mem_List.get(i)[1];
                if(temp_sum >= mid_index){
                    median = mem_List.get(i)[0];
                    break;
                }
            }
        }
        double[] result = {min, max, mean, median, mode};
        return result;
    }
}

改进版

class Solution {
    public double[] sampleStats(int[] count) {
        double min = Double.MAX_VALUE;
        double max = Double.MIN_VALUE;
        double mean = -1;
        double mid = -1;
        double mode = -1;

        for(int i = 0; i < count.length; ++i){
            if(count[i] != 0){
                min = i;
                break;
            }
        }

        for(int i = count.length - 1; i >= 0; --i){
            if(count[i] != 0){
                max = i;
                break;
            }
        }

        double sum = 0;
        int sum_length = 0;
        int val_mode = -1;
        for(int i = 0; i < count.length; ++i){
            sum += i * count[i];
            sum_length += count[i];
            if(val_mode < count[i]){
                val_mode = count[i];
                mode = i;
            }
        }
        mean = sum / sum_length;

        int mid_num1 = (sum_length + 1) / 2;
        int mid_num2 = (sum_length + 2) / 2;
        int l = -1;
        int r = -1;
        int mid_sum = 0;
        for(int i = 0; i < count.length; ++i){
            mid_sum += count[i];
            if(l == -1 && mid_sum >= mid_num1){
                l = i;
            }
            if(r == -1 && mid_sum >= mid_num2){
                r = i;
                break;
            }
        }
        mid = (double) (r + l) / 2;

        return new double[]{min, max, mean, mid, mode};
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值