本篇博客会讲解力扣“2733. 既不是最小值也不是最大值”的解题思路,这是题目链接。
本题的思路是:
- 若数组只有2个元素,显然任意一个元素不是最小值就是最大值。
- 若数组有3个以上的元素,由于提示中的第3点:数组中的所有数字互不相同,只需取前3个元素中,既不是最小值,也不是最大值的数据即可。所以,问题转化为:如何取出3个互不相同的整数中,既不是最小值,也不是最大值的数?
我们可以实现一个函数GetMid,用于完成取“中间值”的操作。具体的思路是分类讨论,假设3个数分别是a、b、c:
- 若a>b:此时若b>c,则有a>b>c,中间值是b;若c>a,则有c>a>b,此时中间值是a;若不满足前面2点,显然中间值既不是b也不是a,则中间值是c。
- 若b>a:此时若a>c,则有b>a>c,中间值是a;若c>b,则有c>b>a,此时中间值是b;若不满足前面2点,显然中间值既不是a也不是b,则中间值是c。
完整代码如下:
int GetMid(int a, int b, int c)
{
if (a > b)
{
if (b > c)
{
return b;
}
else if (c > a)
{
return a;
}
else
{
return c;
}
}
else // b > a
{
if (a > c)
{
return a;
}
else if (c > b)
{
return b;
}
else
{
return c;
}
}
}
int findNonMinOrMax(int* nums, int numsSize){
if (numsSize <= 2)
return -1;
// 返回前3个数字排中间的数
return GetMid(nums[0], nums[1], nums[2]);
}
力扣竟然显示“你的代码真是无敌了!”,这还是第一次见。
总结
- 先把问题转化为取前3个数的中间值问题。
- 接着分类讨论,每种情况的中间值。
感谢大家的阅读!