Easy

题目描述

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

示例 1:

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

示例 2:

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

示例 3:

输入:nums = [2,1,3]
输出:2
解释:由于 2 既不是 nums 中的最大值,也不是 nums 中的最小值,它是唯一的有效答案。

提示:

  • 1 <= nums.length <= 100
  • 1 <= nums[i] <= 100
  • nums 中的所有值都不相同

提示:

  • 找到数组中任何一个既不是最小值也不是最大值的数字。

解题思路

这是一道简单的数组题,我们需要找到既不是最小值也不是最大值的任意一个元素。

解法一:先找最值,再遍历查找(推荐)

  1. 如果数组长度小于3,那么不可能存在既不是最小值也不是最大值的元素,直接返回-1
  2. 找到数组中的最小值和最大值
  3. 遍历数组,找到第一个既不等于最小值也不等于最大值的元素并返回

解法二:排序法

  1. 对数组进行排序
  2. 如果长度小于3返回-1,否则返回排序后的第二个元素(索引为1)

解法三:三元素比较法 由于我们只需要找到任意一个符合条件的元素,可以取数组前三个元素进行比较:

  1. 如果数组长度小于3,返回-1
  2. 对前三个元素排序,返回中间的那个元素

第一种解法最直观且时间复杂度最优,是推荐解法。

代码实现

class Solution {
public:
    int findNonMinOrMax(vector<int>& nums) {
        int n = nums.size();
        if (n < 3) return -1;
        
        int minVal = *min_element(nums.begin(), nums.end());
        int maxVal = *max_element(nums.begin(), nums.end());
        
        for (int num : nums) {
            if (num != minVal && num != maxVal) {
                return num;
            }
        }
        
        return -1;
    }
};
class Solution:
    def findNonMinOrMax(self, nums: List[int]) -> int:
        if len(nums) < 3:
            return -1
        
        min_val = min(nums)
        max_val = max(nums)
        
        for num in nums:
            if num != min_val and num != max_val:
                return num
        
        return -1
public class Solution {
    public int FindNonMinOrMax(int[] nums) {
        if (nums.Length < 3) return -1;
        
        int minVal = nums.Min();
        int maxVal = nums.Max();
        
        foreach (int num in nums) {
            if (num != minVal && num != maxVal) {
                return num;
            }
        }
        
        return -1;
    }
}
var findNonMinOrMax = function(nums) {
    if (nums.length < 3) return -1;
    
    const minVal = Math.min(...nums);
    const maxVal = Math.max(...nums);
    
    for (const num of nums) {
        if (num !== minVal && num !== maxVal) {
            return num;
        }
    }
    
    return -1;
};

复杂度分析

复杂度类型复杂度说明
时间复杂度O(n)需要遍历数组找最值和符合条件的元素
空间复杂度O(1)只使用常数级别的额外空间

相关题目