Общее·количество·просмотров·страницы

Java Dev Notes - разработка на Java (а также на JavaScript/Python/Flex и др), факты, события из АйТи

пятница, 1 октября 2010 г.

Задачка: наибольшая возрастающая непрерывная подпоследовательность (longest increasing contiguous subsequence)

Требуется в заданной последовательности найти наибольшую возрастающую непрерывную подпоследовательность. Например, дана последовательность {1,2,3,-1,2,3,4,5}. В этой последовательности наибольшая возрастающая непрерывная подпоследовательность начинается с позиции 4 и имеет длину 4, т.е. это подпоследовательность {-1,2,3,4,5}.

Запишем всю последовательность в массив. Будем последовательно проходить массив. Если элемент массива больше предыдущего, то увеличим счетчик длины последовательности на 1. Если элемент массива меньше или равен предыдущему, то поставим счетчик длины в 1 (т.к. последовательность), и метку начала подпоследовательности поставим равной текущему индексу. При этом проверим, если длина только что окончившейся подпоследовательности больше предыдущей максимальной, то максимальную длину меняем.

Входные данные передаются так: на первой строчке файла стоит кол-во чисел в последовательности. На всех остальных строчках в начале стоит следующее число в последовательности. Пример входного файла:

8
1
2
3
-1
2
3
4
5

Код:

import java.io.*;
public class Problem1 {
 
static int[] a;
static int startIndex;
static int maxLength;
 
static void findMaxIncrSubseq() {
if (a.length==1) {
startIndex = 0;
maxLength = 1;
return;
}
int start = startIndex = 0;
int length = maxLength = 1;
for (int i=1; i<a.length; i++) {
if (a[i] > a[i-1]) {
length++;
} else {
if (length > maxLength) {
maxLength = length;
startIndex = start;
}
length = 1;
start = i;
}
}
}
 
public static void main(String[] args) throws Exception {
FileInputStream fstream = new FileInputStream("in.txt");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
strLine = br.readLine();
int size = Integer.parseInt(strLine);
a = new int[size];
int i=0;
while ((strLine = br.readLine()) != null) {
a[i] = Integer.parseInt(strLine);
i++;
}
in.close();
findMaxIncrSubseq();
System.out.println("Longest increasing contiguos subsequence starts from " + startIndex + " and is of length " + maxLength);
System.out.println("Longest increasing contiguos subsequence:");
for (i=startIndex; i<startIndex+maxLength; i++) {
System.out.println(a[i]);
}
}
}


Пример файла in.txt:

12
1
2
3
-10
5
6
7
8
9
0
1
2


Пример вывода:

>java Problem1
Longest increasing contiguos subsequence starts from 3 and is of length 6
Longest increasing contiguos subsequence:
-10
5
6
7
8
9

Комментариев нет:

Отправить комментарий

Постоянные читатели