既不是最小值也不是最大值

标签: 数组 排序

难度: Easy

给你一个整数数组 nums ,数组由 不同正整数 组成,请你找出并返回数组中 任一 既不是 最小值 也不是 最大值 的数字,如果不存在这样的数字,返回 -1

返回所选整数。

示例 1:

输入:nums = [3,2,1,4]
输出:2
解释:在这个示例中,最小值是 1 ,最大值是 4 。因此,2 或 3 都是有效答案。

示例 2:

输入:nums = [1,2]
输出:-1
解释:由于不存在既不是最大值也不是最小值的数字,我们无法选出满足题目给定条件的数字。因此,不存在答案,返回 -1 。

示例 3:

输入:nums = [2,1,3]
输出:2
解释:2 既不是最小值,也不是最大值,这个示例只有这一个有效答案。 

提示:

  • 1 <= nums.length <= 100
  • 1 <= nums[i] <= 100
  • nums 中的所有数字互不相同

Submission

运行时间: 36 ms

内存: 16.6 MB

class Solution:
    def findNonMinOrMax(self, nums: List[int]) -> int:
        return sorted(nums[:3])[1] if len(nums) > 2 else -1

Explain

题解利用了数组排序的方法来找出既不是最小值也不是最大值的元素。首先,检查数组长度是否大于2,因为只有长度超过2的数组才可能存在既不是最小值也不是最大值的元素。如果数组长度超过2,题解只对数组的前三个元素进行排序,并返回排序后的第二个元素(即中间的元素)。这种方法依赖于题目条件,即数组中的元素都是不同的正整数,因此排序后的第二个元素不会是最小值或最大值。如果数组长度不超过2,直接返回-1,因为这样的数组无法有满足条件的元素。

时间复杂度: O(1)

空间复杂度: O(1)

class Solution:
    def findNonMinOrMax(self, nums: List[int]) -> int:
        # 检查数组长度是否大于2
        if len(nums) > 2:
            # 对数组的前三个元素进行排序并返回中间的元素
            return sorted(nums[:3])[1]
        # 如果数组长度不超过2,返回-1
        else:
            return -1

Explore

题解中选择对数组的前三个元素进行排序的原因是基于效率和题目的要求。首先,题目要求找出数组中既不是最小值也不是最大值的任一数字。如果数组中至少有三个不同的元素,那么排序后的第二个元素一定既不是最小值也不是最大值。通过只排序前三个元素,我们可以快速找到这样一个符合条件的元素,同时避免了对整个数组进行排序所需的额外时间复杂度。这种方法在满足题目要求的同时,保证了算法的高效性。

不,仅排序前三个元素并返回中间值并不总是满足题目的要求。虽然在许多情况下这种方法是有效的,但如果整个数组的最小值或最大值位于前三个元素之外,那么仅返回排序后的中间元素可能会导致错误的结果。例如,在数组 [4, 1, 3, 2] 中,如果仅考虑前三个元素 [4, 1, 3],排序后中间值为3,但实际上2也是一个有效答案,且没有被考虑。因此,这种方法虽然在一定程度上降低了计算复杂度,但可能会忽略其他合法的解。

在这种特殊情况下,即使数组中的元素值都非常接近(如示例中的1000, 999, 998),排序后的中间值(999)确实既不是数组中的最小值(998)也不是最大值(1000)。因此,即便这些值非常接近,中间值仍然满足题目要求,不是最小值也不是最大值。这证明了即使在元素值非常接近的情况下,本题解法依然有效。