📅  最后修改于: 2023-12-03 15:07:34.048000             🧑  作者: Mango
这道题目要求我们找到一组数中第二小的数。下面是它的具体描述:
给定 $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。