LeetCode 1619.删除某些元素后的数组均值(c++)

127 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

一、题目描述

1619.删除某些元素后的数组均值

示例 1:

输入:arr = [1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3]
输出:2.00000
解释:删除数组中最大和最小的元素后,所有元素都等于 2,所以平均值为 2 。

示例 2:

输入:arr = [6,2,7,5,1,2,0,3,10,2,5,0,5,5,0,8,7,6,8,0]
输出:4.00000

示例 3:

输入:arr = [6,0,7,0,7,5,7,8,3,4,0,7,8,1,6,8,1,1,2,4,8,1,9,5,4,3,8,5,10,8,6,6,1,0,6,10,8,2,3,4]
输出:4.77778

提示:

  • 20 <= arr.length <= 1000
  • arr.length ****是 20 的 倍数 
  • 0 <= arr[i] <= 105

二、思路分析

这是一道简单题,同样考验了对于c++中的vector容器的一些基本操作。如利用accumulate对vector中的元素进行求和、利用sortvector中的元素进行排序。如果不知道这些基本方法,则需要通过for循环等方式来进行求和排序,会使得整个程序十分复杂。

我刚开始就利用了冒泡排序法对vector中的元素进行排序,虽然也能做出来,但编译时间会很慢。利用sort函数则能显著的提高程序的编译速度。

在排序后对vector中掐掉了前百分之五和后百分之五的元素进行求和,最后求出平均值。

三、AC代码

class Solution {
public:
    double trimMean(vector<int>& arr) {

        int a = arr.size();
        sort(arr.begin(),arr.end());
        double x=a*0.1/2;
    vector<int>::const_iterator first1 = arr.begin()+x;
    vector<int>::const_iterator last1  = arr.end();
    vector<int> cut1_vector(first1, last1);
    double aver=accumulate(cut1_vector.begin(),cut1_vector.end()-x,0)/(a-x-x);
    return aver;

    }
};

四、总结

对于我这样初学c++的人来说,这样的题目十分有帮助的。在解题的过程中不仅进一步加深了对vector的理解,也能够了解一些关于vector的基本操作。这远比在书本上学习更有效率。