元素计数

标签: 数组 排序

难度: Easy

给你一个整数数组 nums ,统计并返回在 nums 中同时至少具有一个严格较小元素和一个严格较大元素的元素数目。

示例 1:

输入:nums = [11,7,2,15]
输出:2
解释:元素 7 :严格较小元素是元素 2 ,严格较大元素是元素 11 。
元素 11 :严格较小元素是元素 7 ,严格较大元素是元素 15 。
总计有 2 个元素都满足在 nums 中同时存在一个严格较小元素和一个严格较大元素。

示例 2:

输入:nums = [-3,3,3,90]
输出:2
解释:元素 3 :严格较小元素是元素 -3 ,严格较大元素是元素 90 。
由于有两个元素的值为 3 ,总计有 2 个元素都满足在 nums 中同时存在一个严格较小元素和一个严格较大元素。

提示:

  • 1 <= nums.length <= 100
  • -105 <= nums[i] <= 105

Submission

运行时间: 22 ms

内存: 16.1 MB

class Solution:
    def countElements(self, nums: List[int]) -> int:
        nums.sort()
        a, b = min(nums), max(nums)
        res = []
        for i in nums:
            if i != a and i != b:
                res.append(i)
        return len(res)

Explain

此题解通过首先对数组进行排序,确保数组元素按照从小到大的顺序排列。排序后,数组的第一个元素是最小元素,最后一个元素是最大元素。接着,定义两个变量a和b,分别存储数组中的最小值和最大值。然后,遍历排序后的数组,对于数组中的每个元素i,如果i既不等于a也不等于b,说明i有至少一个严格较小的元素和至少一个严格较大的元素,将其添加到结果列表res中。最后,返回结果列表res中元素的个数,即为题目所求的满足条件的元素数目。

时间复杂度: O(n log n)

空间复杂度: O(n)

# 定义Solution类

class Solution:
    def countElements(self, nums: List[int]) -> int:
        nums.sort()  # 对数组进行排序
        a, b = min(nums), max(nums)  # 获取数组中的最小值和最大值
        res = []  # 初始化结果列表
        for i in nums:  # 遍历排序后的数组
            if i != a and i != b:  # 检查元素是否非最小和最大
                res.append(i)  # 将满足条件的元素添加到结果列表
        return len(res)  # 返回结果列表的长度

Explore

在此题解中,使用min和max函数来确定最小和最大元素可能是不必要的,因为数组已经排序。直接使用排序后的数组的第一个和最后一个元素作为最小和最大值是更高效的做法。这种使用min和max的方式可能是因为初始代码设计时考虑了代码的通用性或可读性,但在已排序的数组中,直接使用数组的首尾元素作为最小和最大值是更优的选择。

是的,有更高效的方法。可以通过设置一个计数器来计算满足条件的元素数量,而不是将它们存储在列表中。通过这种方式,可以节省空间并提高效率。具体地,初始化一个计数器为0,然后遍历数组,每当找到一个满足条件的元素时,计数器增加1。这样可以直接得到满足条件的元素数目,无需使用额外的列表来存储元素。

在题解中选择遍历整个数组是为了确保每个元素都被检查是否满足条件。确实,可以通过直接计数的方式简化这一过程,特别是在数组已经排序后。具体地,可以使用两个指针或索引来分别指向第一个和最后一个不是最小和最大的元素,然后计算这两个指针之间元素的数量。这种方法可以减少不必要的比较和循环,提高算法的效率。

如果数组中有重复元素,题解中的算法仍然适用,因为算法本质上是排除最小值和最大值。重复的最小值和最大值在算法中会被一并排除,中间的元素(即使重复)仍然会被计算在内。因此,算法在处理有重复元素的数组时仍然是有效的,只要正确地识别出最小值和最大值并计算中间元素的数量即可。