min-max w tablicy bez elementu, który powtarza się tylko raz

0

Tak jak w tytule; utknalem w momencie, gdzie nie wiem dlaczego liczy tylko ilość wystąpień dla jednego największego elementu, będę wdzięczny za każdą pomocną odpowiedź :) Pozdrawiam

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <conio.h>

using namespace std;

void min_max(int *Z, int N)
{
    int min_nie_sam=0,max_nie_sam=0; //
    int  i, j, L, W, D, X;
    for( i=0 ; i<N ; i++) // petla zapamietujaca ilosc wystapien poszczegolnych liczb w tablicy
    {
        W = Z [ i ];
        L = 0;
            for( j = 0; j < N; j++)
            {
                if( Z [ j ] == W)

            }
        if (L==1)
            W=D;
    }
// Wypisujemy tablice
  for( i = 0; i < N; i++ )
  {
      if( Z [ i ] == D )
        cout << " >" << setw ( 2 ) << Z [ i ];
    else
        cout << setw ( 5 ) << Z [ i ];
  }

// Wypisujemy najczestszy element oraz liczbe wystapien
cout<<"\n\n";

  for (int i=0; i<N; i++)
  {
      if (Z[i]==D)
        Z[i]=0;
  }
  cout<<"Tablica bez elelmentu ktory powtarza sie tylko raz: \n\n";
  for (int i=0; i<N; i++)
    cout<<Z[i]<<setw(3);
        cout<<"\n\n";
        for(int i =0; i < N; i++)
            {
            if(Z[i] < min_nie_sam)
                min_nie_sam = Z[i];
            if(Z[i] > max_nie_sam)
                max_nie_sam = Z[i];
            }
cout<<"\n\nMinimum wynosi : "<<min_nie_sam<<"\n";
cout<<"\n\nMaksimum wynosi : "<<max_nie_sam<<"\n";

}
int main()
{
    int N=40;
    int Z[N];
    srand(time(NULL));
    for(int i=0; i<N; i++)
    {
        Z[i]=200+rand()%30;;
    }
    cout<<"\n\n";
    min_max(Z,N);
    getch();
    return 0;
}
5
int min_nie_sam=0
// ...
            if(Z[i] < min_nie_sam)
                min_nie_sam = Z[i];

Mniejsze od zera są tylko wartości ujemne, a takich nie losujesz. Przy takim liczeniu minimum inicjalizuj std::numeric_limits<int>::max()

Swoją drogą, strasznie przekombinowane zadanie. Tu masz przykład bardziej po C++-owemu:

optional<pair<int,int>>
min_max_multiple(vector<int> nums)
{
    map<int, size_t> counts;
    for (int n : nums)
        counts[n]++;

    auto pred = [&](int n){ return counts[n] == 1; };
    auto it = remove_if(nums.begin(), nums.end(), pred);
    nums.erase(it, nums.end());
    if (nums.size() == 0)
        return nullopt;
    auto [min, max] = minmax_element(nums.cbegin(), nums.cend());
    return {{*min, *max}};
}

https://wandbox.org/permlink/gieGYyw9avUhoGfD

0

Tylko chodzi o to, że po mapach jeszcze dobrze nie operuję a chciałbym to zrobić bo wiem, że się da przy użyciu trochę "gorszej" metody :D

1

Czemu nie zaczniesz od posortowania tablicy?

3

O(n)

template<typename In, typename F>
auto minmax_element_repeted_at_least(In b, In e, size_t n, F f)
{
    using value_type = typename std::iterator_traits<In>::value_type;
    std::unordered_map<value_type, size_t> used;

    while (b != e && ++used[*b] < n) ++b;

    std::pair<In, In> r{b, b};
    if (b != e){
        for (++b; b != e; ++b) {
            if (++used[*b] >= n) {
                if ( f(*b,  *r.first)) r.first  = b;
                if (!f(*b, *r.second)) r.second = b;
            }
        }
    }

    return r;
}

template<typename In>
auto minmax_element_repeted_at_least(In b, In e, size_t n = 2)
{
    return minmax_element_repeted_at_least(b, e, n, std::less{});
}

https://godbolt.org/z/M6x5G1

1 użytkowników online, w tym zalogowanych: 0, gości: 1