2015-02-28 3 views
0

Итак, я работаю над преобразованием этой логики из 2D-приложения в функцию в массиве 1D. Вещь, которая в основном сбивает меня с толку, это массивы и их функционирование. Любой вход был бы оценен!Преобразование из 2D в 1D массив

LcgRandom rand = new LcgRandom(); 
 
\t \t 
 
\t \t int[][] triangle = new int[ROWS][]; 
 
\t \t 
 
\t \t for (int i = 0; i < triangle.length; i++) { 
 
\t \t \t triangle[i] = new int[i + 1]; 
 
\t \t \t //System.out.println(triangle[i]); 
 
\t \t \t for (int j = 0; j <= i; j++) 
 
\t \t \t \t triangle[i][j] = rand.next(); 
 
\t \t \t \t //System.out.println(triangle[i]); 
 
\t \t } 
 
\t \t 
 
\t \t //Calculate row sums 
 
\t \t int[][] rowSums = new int[triangle.length][]; 
 
\t \t 
 
\t \t for (int i = 0; i < rowSums.length; i++) { 
 
\t \t \t rowSums[i] = new int[triangle[i].length + 1]; 
 
\t \t \t rowSums[i][0] = 0; 
 
\t \t \t for (int j = 0; j <= i; j++) 
 
\t \t \t \t rowSums[i][j + 1] = rowSums[i][j] + triangle[i][j]; 
 
\t \t } 
 
\t \t 
 
\t \t //find the smallest triangle 
 
\t \t long minSum = 0; 
 
\t \t 
 
\t \t for (int i = 0; i < triangle.length; i++) { 
 
\t \t \t for (int j = 0; j < triangle[i].length; j++) { 
 
\t \t \t \t 
 
\t \t \t \t long curSum = 0; 
 
\t \t \t \t for (int k = i; k < triangle.length; k++) { 
 
\t \t \t \t \t curSum += rowSums[k][k - i + 1 + j] - rowSums[k][j]; 
 
\t \t \t \t \t if (minSum>curSum) 
 
\t \t \t \t \t \t minSum=curSum; 
 
\t \t \t \t \t System.out.println(minSum); 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t } 
 
\t \t return Long.toString(minSum); 
 
\t }

ответ

0

Если вы собираетесь хранить 2D массива в строке основной форме т.е. хранить все элементы Row1, а затем row2 элементы и так далее линейно, то вам необходимо настроить расчет индекса.

Предполагая, что ваш 2D-массив имеет R строк и столбцы C, каждая строка содержит элементы C. Таким образом, ваши индексы рассчитываются как:

array_1d[j + i*C] == array_2d[i][j] // This is true. 

Таким образом, ваш массив 1D будет иметь R * C элементы в нем.

+0

Так что это итерация через «треугольные» данные означает, что будут «высоты» * «высота» +1 запись данных? Или вы говорите, что прямая реализация может быть изменена с помощью вышеприведенного фрагмента? – TurdSchnugle

+0

Вы можете выделить элементы 'r * c' и выполнить итерацию с приведенной выше логикой (для индексирования), а если вы делаете правильно, она должна быть идентична 2D-случаю. Если для каждой строки нет столбцов, то ваш 'C' соответственно изменится. –

Смежные вопросы