De ce contează?
Stai la coadă la supermarket și vrei să știi cine e mai înalt decât tine. Nu îi măsori pe toți și sortezi — compari pe fiecare cu „campionul" curent. Când găsești pe cineva mai înalt, el devine noul campion. La final ai maximul fără să fi ținut minte toată coada.
Algoritmul
Menținem o variabilă maxim pe care o actualizăm la fiecare nou element:
| sir | 4 | 7 | 2 | 9 | 1 |
| index | 0 | 1 | 2 | 3 | 4 |
max |
Citim: 4 7 2 9 1
maxim = INT_MIN
x=4: 4 > INT_MIN → maxim = 4
x=7: 7 > 4 → maxim = 7
x=2: 2 < 7 → ramane 7
x=9: 9 > 7 → maxim = 9
x=1: 1 < 9 → ramane 9
Rezultat: 9Inițializarea — detaliul care decide corectitudinea
Trei variante corecte:
// Varianta 1: INT_MIN / INT_MAX (necesita <climits>)
int maxim = INT_MIN;
int minim = INT_MAX;
// Varianta 2: citeste primul element separat
int x; cin >> x;
int maxim = x, minim = x;
for (int i = 1; i < n; i++) { ... }
// Varianta 3: valori garantate de enunt (ex. "valorile sunt 1..100")
int maxim = 0; // OK doar daca stii ca valorile sunt pozitive
int minim = 101; // OK doar daca stii ca valorile sunt <= 100Implementare C++ — complet
#include <iostream>
#include <climits>
#include <fstream>
using namespace std;
int main() {
ifstream fin("minmax.in");
ofstream fout("minmax.out");
int n;
fin >> n;
int maxim = INT_MIN, minim = INT_MAX;
int poz_max = -1, poz_min = -1; // pozitia (0-based) unde apar
for (int i = 0; i < n; i++) {
int x;
fin >> x;
if (x > maxim) { maxim = x; poz_max = i; }
if (x < minim) { minim = x; poz_min = i; }
}
fout << maxim << " " << poz_max << "\n";
fout << minim << " " << poz_min << "\n";
return 0;
}Exemplu: Input 5 / 4 7 2 9 1 → 9 3 / 1 4
Dacă vrei prima apariție a maximului, condiția rămâne x > maxim (strict mai mare). Dacă vrei ultima apariție, schimb-o în x >= maxim. Mica diferență — un singur caracter — decide care poziție returnezi când există duplicate.
Complexitate
| Caz | Timp | Spațiu |
|---|---|---|
| Maxim și minim simultan | O(n) | O(1) |
Vizualizare
Urmărește cum maximul se actualizează la fiecare element parcurs:
Folosește ← și → pentru a avansa pas cu pas, sau Redă pentru animație automată. Apasă Laborator ca să testezi cu propriul tău șir.
Greșeala 1: maxim = 0 când valorile pot fi negative. Rezultatul va fi 0 chiar dacă nicio valoare nu e 0 sau pozitivă.
Greșeala 2: Actualizezi poz_max corect la prima apariție dar uiți să actualizezi și maxim — sau invers. Asigură-te că ambele se actualizează în același if.
Greșeala 3: Citești n dar indexul buclei merge de la 1 la n în loc de 0 la n-1 (sau i < n). Off-by-one — citești n-1 sau n+1 valori.