解题思路

需要考虑特殊情况:

  1. 所有数字相同时,第二大的数就是这个数字
  2. 使用set去重后判断是否只有一个数字
  3. 如果有多个数字,则取第二大的数

代码

#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)
  • 时间复杂度:,只需要遍历一次数组
  • 空间复杂度:,只需要两个变量存储结果