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
- Nếu
s_maxvẫ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.