Maxim și minim

Bază~13 min7 pași

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
Șirul de intrare. Elementul maxim (9) se află la index 3 — îl descoperim parcurgând valorile una câte una.
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: 9

Iniț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 <= 100

Implementare 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 19 3 / 1 4

Observația-cheie

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

CazTimpSpațiu
Maxim și minim simultanO(n)O(1)

Vizualizare

Urmărește cum maximul se actualizează la fiecare element parcurs:

Indiciu

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șeli frecvente

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.

Întrebarea 1 / 3

Care e inițializarea corectă a lui `maxim` înainte de a citi n numere?