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 <= 1001 <= nums[i] <= 100nums中的所有值都不相同
提示:
- 找到数组中任何一个既不是最小值也不是最大值的数字。
解题思路
这是一道简单的数组题,我们需要找到既不是最小值也不是最大值的任意一个元素。
解法一:先找最值,再遍历查找(推荐)
- 如果数组长度小于3,那么不可能存在既不是最小值也不是最大值的元素,直接返回-1
- 找到数组中的最小值和最大值
- 遍历数组,找到第一个既不等于最小值也不等于最大值的元素并返回
解法二:排序法
- 对数组进行排序
- 如果长度小于3返回-1,否则返回排序后的第二个元素(索引为1)
解法三:三元素比较法 由于我们只需要找到任意一个符合条件的元素,可以取数组前三个元素进行比较:
- 如果数组长度小于3,返回-1
- 对前三个元素排序,返回中间的那个元素
第一种解法最直观且时间复杂度最优,是推荐解法。
代码实现
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) | 只使用常数级别的额外空间 |
相关题目
- . Third Maximum Number (Easy)