👤

Fie a un vector cu (n<=50) componente de tip int. Determinati un element din vector care se repeta de cele mai multe ori.
Programul pe care l-am scris il inserez mai jos.
1) Este vreo metoda mai eficienta?
2) Este vreo metoda eficienta pentru a nu verifica valorile care s-au verificat anterior?
(de ex ptu {5, 6, 1, 7, 5, 1, 90, 5, 8} 5 se va verifica de 3 ori) eliminarea tuturor valorilor care s-au verificat si folosirea altui vector in care introducem valorile verificate mi se par cam ineficiente.



#include <iostream.h>
int main()

{
int a[50], i, j, n, val, nr=0, nrmax=0;
cout<<"n="; cin>>n;

  cout<<"Introduceti componentele vectorului:";
    for (i=0; i<n; i++) cin>>a[i];

   for (i=0; i<n; i++)   
   {
      for (j=1; j<n; j++) 
         if (a[i]==a[j]) nr++;
    if (nr>nrmax) nrmax=nr, val=a[i];
    }

cout<<val;  
return 0;
}


Răspuns :

#include <iostream>
#include <limits.h>
using namespace std;
const int NMAX = 200000000;

int nr[NMAX];

int main()
{
    int n, x, Max = 0, poz = 1;
    cin >> n;
    for(int i=1; i<=n; i++) {
        cin >> x;
        nr[x]++;
        if(nr[x] >= Max) { Max = nr[x]; poz = x; }
    }
    cout << '\n' << poz << '\n';
}

Si fara vectori :)

#include <iostream>
#include <algorithm>
using namespace std;
int main(){
    int n, i, max_pos=-1, max_count=-1, tmp1, tmp2, tmp3;
    cin>>n;int a[n];
    for (i=0;i<n;i++) cin>>a[i];
    sort(a, a+n);
    for(i=0;i<n;i++){
        tmp1=i+1;
        tmp2=i;//poz curenta
        tmp3=1;//nr de nr gasite
        while(a[i]==a[tmp1]){
            tmp3++;
            tmp1++;
        }
        if(tmp3>max_count){
            max_pos=tmp2;
            max_count=tmp3;
        }
        i=tmp1-1;
    }
    cout<<a[max_pos];
    return 0;
}