📌  相关文章
📜  国际空间研究组织 | ISRO CS 2013 |问题 49(1)

📅  最后修改于: 2023-12-03 15:07:34.048000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2013 |问题 49

这道题目要求我们找到一组数中第二小的数。下面是它的具体描述:

问题描述

给定 $N$ 个数字,找到这些数字中第二小的数字。

输入格式

第一行包含一个整数 $T$,表示测试用例的数量。每个测试用例的第一行是一个整数 $N$,表示数字的数量。每个测试用例的第二行包含 $N$ 个整数,表示这些数字。

输出格式

对于每个测试用例,输出第二小的数字。如果不存在第二小的数字,则输出 -1。

输入样例
2
5
2 4 5 6 7
6
7 7 7 7 7 7
输出样例
4
-1
说明

第一个测试用例中,第二小的数字是 4。

第二个测试用例中,除了 7 以外没有其他数字,因此不存在第二小的数字,输出 -1 。

解题思路

这个问题有多种解法,我们将介绍其中两种。

解法一:排序

可以将所有数字排成一个非降序列,然后按顺序找到第二小的数字。时间复杂度为 $O(N \log N)$。下面是示例代码:

def second_minimum_number(nums):
    if len(nums) < 2:
        return -1
    nums.sort()
    if nums[0] == nums[1]:
        return -1
    return nums[1]
解法二:两遍扫描

首先找到最小的数字,然后在第二遍扫描中找到第二小的数字。时间复杂度为 $O(N)$。下面是示例代码:

def second_minimum_number(nums):
    if len(nums) < 2:
        return -1
    first_min = min(nums)
    second_min = float('inf')
    for num in nums:
        if num > first_min and num < second_min:
            second_min = num
    if second_min == float('inf'):
        return -1
    return second_min
总结

本题要求我们找到一组数字中第二小的数字。我们介绍了两种解法,分别是排序方法和两遍扫描方法。这两种方法的时间复杂度分别为 $O(N \log N)$ 和 $O(N)$,其中 $N$ 是数组中数字的数量。如果数组中没有第二小的数字,两种方法将都会返回 -1。