Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Tìm phần tử lớn nhất và lớn thứ hai trong mảng C++


Cho mảng không sắp xếp, tìm max và second max **phân biệt** (distinct). Mảng có thể có trùng lặp. Ví dụ:

Đầu vào 1: {2,2,1,3,4} → Đầu ra: 4 3.

Đầu vào 2: {1,3,3,2} → Đầu ra: 3 2.

Phương pháp: Duyệt một lần

  • Khởi tạo max = INT_MIN, s_max = INT_MIN.
  • Duyệt từng phần tử x:
    • Nếu x > max: s_max = max; max = x;
    • Ngược lại nếu x > s_max && x != max: s_max = x;
  • Nếu s_max vẫn là INT_MIN → gán -1 (không có second max).

Ví dụ mã nguồn

#include <bits/stdc++.h>
using namespace std;

void maxAndSecondMax(int *arr, int size) {
    int max = INT_MIN, s_max = INT_MIN;
    for (int i=0;i max) {
            s_max = max;
            max = arr[i];
        } else if (arr[i] > s_max && arr[i] != max) {
            s_max = arr[i];
        }
    }
    if (s_max == INT_MIN) s_max = -1;
    cout << max << ' ' << s_max;
}

int main() {
    int A[] = {1,3,2,5,6,3};
    maxAndSecondMax(A, 6); // 6 5
    return 0;
}

Kết quả

6 5

Phức tạp O(n) thời gian, O(1) không gian.