najdłuższy podciąg liczb dodatnich

0

Takie zadanie: wczytać ciąg liczb, a następnie wyszukać w nim najdłuższy podciąg składający się wyłącznie z liczb dodatnich i go zwrócić z funkcji.

myślałem zrobić tak: wczytać liczby do vectora (w sumie nie wiem czy to dobry pomysł) w funkcji iterowac po vectorze, jeśli iterator>0 wrzucić go do nowego vectora, jeśli<0 to sprawdzić czy rozmiar tego nowego vectora>0 (tu mi się pomysł kończy) i dalej iterować w poszukiwaniu większego podciągu.

mam tak:

vector<float> funkcja(vector<float> &v) {
    vector<float> tmp;
    int max = 0;
    for (auto it = v.begin(); it != v.end(); it++) {
        if(*it > 0) {
            tmp.push_back(*it);
        }
        else {
            if (tmp.size() > max) {
                //nie wiem co dalej
            }
        }
    }

    return tmp;
}

ale nie wiem co dalej z tym robić, proszę o pomoc ;/

0

Twój pomysł jest dobry.
Z małym usprawnieniem: nie musisz wrzucać podciągu do nowego wektora tylko możesz zapamiętać pozycję początku/końca podciągu.

0

Kolekcjonuj raczej pozycje i długości niż wartości.

0

@Delor @vpiotr ale jeśli jednak będą to wartości, a nie indeksy, to całości ciągu w ogóle można nie trzymać w pamięci (tzn. przy wczytaniu liczby niedodatniej, zerujesz jakiś wektorek, przy wczytaniu dodatniej, dopisujesz element na koniec).

0

Wtedy nie wczyta do wektora na początku i nie przeiteruje po nim. Za to będzie dużo kopiowania/przenoszenia. Wtedy lista będzie lepsza od wektora.
EDIT: Wektor jednak lepszy.

0

Robiliśmy kiedyś podobne zadanie, ale tam były tablice i tworzyliśmy właśnie zmienne do zapamiętania pozycji i długości (typu int były) ale nie wiem jak to przełożyć na wektor
gubię się w tym trochę, próbuje robić na wzór tamtego zadania ale bez efektów ;/

int funkcja(vector<float> &v) {
    //vector<float> tmp;
    int BestD = 0; //dlugosc
    int BestP = 0; //pozycja
    int k = 0;
    for (auto it = v.begin(); it != v.end(); it++) {
        while (*it > 0) {
            k++;
        }
        if (k>BestD) {
            BestD = k;
            BestP = *it;
        }
    }
    return k;
}
0

Potrafiłbyś to zrobić na wskaźnikach i zwykłej tablicy float *? Jeżeli tak to potraktuj vector<float>::iterator jak wskaźnik.
Przykładowe operacje:

float tab[];
...
float * it=tab; //wskaźnik na początek tablicy
it++;  //przejście do następnego elementu
cout << *it;  //wypisanie wartości na jaką wskazuje wskaźnik
float * saved = it; //zapamiętanie pozycji

odpowiadają:

vector<float> tab;
...
vector<float>::iterator it=tab.begin();  //iterator na początek wektora
it++;  //przejście do następnego elementu
cout << *it;  //wypisanie wartości na jaką wskazuje iterator
vector<float>::iterator saved = it; //zapamiętanie pozycji iteratora

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