解题思路
需要考虑特殊情况:
- 所有数字相同时,第二大的数就是这个数字
- 使用set去重后判断是否只有一个数字
- 如果有多个数字,则取第二大的数
代码
#include <iostream>
#include <set>
using namespace std;
int main() {
int n;
cin >> n;
// 使用set自动去重和排序
set<int> nums;
// 读取输入
for(int i = 0; i < n; i++) {
int x;
cin >> x;
nums.insert(x);
}
// 如果只有一个数字,说明所有数字都相同
if(nums.size() == 1) {
cout << *nums.begin() << endl;
return 0;
}
// 否则输出第二大的数
auto it = nums.rbegin();
++it; // 移动到第二个数
cout << *it << endl;
return 0;
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
// 使用TreeSet自动去重和排序
TreeSet<Integer> nums = new TreeSet<>();
// 读取输入
for(int i = 0; i < n; i++) {
nums.add(sc.nextInt());
}
// 如果只有一个数字,说明所有数字都相同
if(nums.size() == 1) {
System.out.println(nums.first());
return;
}
// 否则输出第二大的数
System.out.println(nums.lower(nums.last()));
}
}
def find_second_largest():
n = int(input())
nums = list(map(int, input().split()))
# 去重并排序
unique_nums = sorted(set(nums))
# 如果只有一个数字,说明所有数字都相同
if len(unique_nums) == 1:
print(unique_nums[0])
return
# 否则输出第二大的数
print(unique_nums[-2])
if __name__ == "__main__":
find_second_largest()
算法及复杂度
- 算法:单次遍历(One Pass)
- 时间复杂度:,只需要遍历一次数组
- 空间复杂度:,只需要两个变量存储结果