java - 从上到下编号三角形

标签 java methods multidimensional-array max min

下面我试图想出一种方法来找到路径来找出最短路径,但每次运行程序时,我都会在 int cols = myArray[rows].length 处的 findshortestPath1 处收到空指针异常,我不知道如何解决这个问题。如果您有其他方法我可以尝试解决这个问题,我将不胜感激。

********更新******** 好的,我根据您的建议更新了该代码,但我仍然遇到问题

minCosts[0] = myArray[row][col]

findShortestPath(myArray, minCosts, row, col);

代码:

import java.util.Random;


public class Triangle{

 public static void createTriangle(int numRows){

     int rows=numRows;
     int max =9, min =2;
     int[][] myArray = new int[rows][];
     Random random = new Random();

for (int i = 0; i < rows; i++) {

myArray[i]= new int[i+1];


//Below is used for organizing the triangle
System.out.println("");
for(int p=rows-i; p>0;p--)
System.out.print(" ");

for (int j = 0; j <=i; j++) {

//below puts the spacing between each column in the triangle
System.out.print(" ");



myArray[i][j] = random.nextInt(max - min + 1) + min;

System.out.print(myArray[i][j]);
    System.out.print(" ("+i+", "+j+") ");
 }
 }
 }

public static int findShortestPath1(int numRows) {


     int rows= numRows;
     int[][] myArray = new int[rows][];

     int numNodes = sumToN(rows);
     int[] minCosts = new int[numNodes];

     for(int row = 0; row<rows; row++) {
         int cols = new int[rows].length;

     for(int col = 0; col< cols; col++) {
         findShortestPath(myArray, minCosts, row, col);
     }
     }





 int row = rows;
 int cols = new int[rows].length;
 int min1 = -1;

 for(int col = 0; col<cols; col++) {
  int cost = minCosts[indexFromRowCol(rows,col)];

  if(cost < min1 || min1 ==-1) {
      min1 = cost;
  }
  }

  return Math.max(0, min1);
  }



  private static int findShortestPath(int[][] myArray, int[] minCosts, int        row, int col) {
if (row == 0) {
    minCosts[0] = myArray[row][col];
    return minCosts[0];
}

int minValue = -1;

if (col - 1 >= 0) {
    minValue = minCosts[indexFromRowCol(row - 1, col - 1)];
}

if (col < myArray[row - 1].length) {
    int cost = minCosts[indexFromRowCol(row - 1, col)];

    if (minValue == -1) {
        minValue = cost;
    }

    minValue = Math.min(minValue, cost);
}

int minCost = myArray[row][col] + minValue;
minCosts[indexFromRowCol(row, col)] = minCost;

return minCost;
}

private static int sumToN(int n) {
if (n < 0) {
    return 0;
}
return n * (n + 1) / 2;
}

private static int indexFromRowCol(int row, int col) {
return sumToN(row) + col; 

} }

最佳答案

这个:

for(int row = 0; row >= rows; row++)

应该是:

for(int row = 0; row < rows; row++)

例如,假设行数 = 10。那么 row >= rows 相当于 0 >= 10,即 false,因此 for 循环永远不会运行。

当你这样做时:

int row = rows - 1;
int cols = myArray[row].length;

您将得到 row = 9,但是由于 for 循环未执行,myArray 仍然为空。因此,当您尝试访问 myArray[9].length 时,您会收到 NullPointerException

另一个问题是,因为您在初始化第二个维度的大小时没有初始化:

int[][] myArray = new int[rows][];

当您尝试执行以下操作时,您仍然会在 for 循环中遇到 NullPointerException:

int cols = myArray[row].length;

因此,您可能希望像在 createTriangle() 中那样在 findShortestPath1() 中初始化 myArray

关于java - 从上到下编号三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29461853/

相关文章:

Java非阻塞IO选择器导致 channel 寄存器阻塞

java - 无法对非静态方法库进行静态引用

java - 将变量分配给特定分隔符之间的文本字符串,例如。 “|” 使用Java

http - 有多少个 HTTP 动词?

java - 有条件地添加额外的 else if 语句

C 计算二维数组中字符串的频率

php过滤数组值并从多维数组中删除重复项

JavaScript 对象尺寸

java - 在 JDBC 中使用 class.forName

java - 使用 Java 列出信封状态更改 PARTNER_AUTHENTICATION_FAILED