力扣刷题笔记第一天

题目:

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

难度简单

给你一个整数数组 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 既不是最小值,也不是最大值,这个示例只有这一个有效答案。

#include <iostream>
#include <vector>             //STL 模板所需头文件
#include <algorithm>        //sort函数所需头文件
using namespace std;

class Solution {
public:
    int findNonMinOrMax(vector<int>& nums) {
        if (nums.size() < 3) {
            return -1;
        }
        sort(nums.begin(), nums.begin() + 3); // 只对前三个数排序,有点取巧但是没毛病
        //sort默认快排从小到大,整个数组排序后第2 个元素肯定既不最大也不最小。
        //ort(nums.begin(), nums.end());        正常应该是遍历整个数组
        return nums[1]; 
    }
};

int main() {
    vector<int> nums = { 1, 2, 3, 4, 5 };       //模板定义初始化数组
    Solution s;                                 //默认构造创建对象
    int res = s.findNonMinOrMax(nums);          
    cout << res << endl; // 输出2

    nums = { 3, 2, 1 };
    res = s.findNonMinOrMax(nums);
    cout << res << endl; // 输出2

    nums = { 1, 1, 1, 2 };
    res = s.findNonMinOrMax(nums);
    cout << res << endl; // 输出1

    return 0;
}

C语言实现方法如下

#include <stdio.h>
#include <stdlib.h>   //qsort 所需头文件

/* 比较函数,用于 qsort 函数排序 */
int compare(const void* a, const void* b) {
    return *(int*)a - *(int*)b;
}

/* 求一个整数数组中除最小值和最大值之外的另一个数 */
int findNonMinOrMax(int* nums, int numsSize) {
    /* 若数组元素个数不大于2,则无解,返回-1 */
    if (numsSize <= 2) {
        return -1;
    }
    /* 对整数数组进行排序 */
    qsort(nums, numsSize, sizeof(nums[0]), compare);
    /* 返回排序后索引为1的元素 */
    return nums[1];
}

int main() {
    int nums[] = {1, 2, 3, 4, 5};
    int numsSize = sizeof(nums) / sizeof(int);
    /* 调用函数求解数组中除最小值和最大值之外的另一个数 */
    int res = findNonMinOrMax(nums, numsSize);
    printf("%d\n", res); /* 输出2 */

    int nums2[] = {3, 2, 1};
    numsSize = sizeof(nums2) / sizeof(int);
    res = findNonMinOrMax(nums2, numsSize);
    printf("%d\n", res); /* 输出2 */

    int nums3[] = {1, 1, 1, 2};
    numsSize = sizeof(nums3) / sizeof(int);
    res = findNonMinOrMax(nums3, numsSize);
    printf("%d\n", res); /* 输出1 */

    return 0;
}

qsort() 函数是 C 语言标准库中的快速排序(Quick Sort)函数,可以用于对数组中的元素排序。该函数的原型如下:

void qsort(void* base, size_t nmemb, size_t size, int (*compar)(const void*, const void*));

参数说明:

void* base:要排序的数组的首地址
size_t nmemb:要排序的数组元素个数
size_t size:每个元素大小(字节数)
int (*compar)(const void*, const void*):比较函数,用于确定元素的大小顺序
qsort() 函数使用快速排序算法来对 base 指向的一维数组的 nmemb 个元素进行排序,排序的结果按照指定比较函数的返回值确定元素的大小顺序。排序后的结果保存在原数组中。

需要注意以下几点:

compar 比较函数必须满足以下条件:
接收两个指向常量对象的指针作为参数
返回一个整数值:若返回一个小于零的值,则表示第一个参数小于第二个参数;若返回值为零,则表示两个参数相等;若返回一个大于零的值,则表示第一个参数大于第二个参数
排序后不能再使用原数组去进行元素操作,因为 qsort() 函数会直接修改原数组元素的位置
在本题中,我们使用 qsort() 函数对正整数数组进行排序,因为需要找到除最小值和最大值之外的另一个数。排序后索引为1的元素即为所求答案,因为排序后数组的第一个元素为最小值,第三个元素为最大值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值