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