如何使用Java找到矩阵的鞍点?

时间:2014-01-24 17:27:02

标签: java

如何找到矩阵的鞍点,这是行中的最高数字,同时是使用Java的列中的最高数字?

例如,使用此矩阵:

| 7 2 |

| 1 3 |

| 5 8 |

鞍点是:7和8。

以下是我编写的代码部分,用于查找行和列中的最高编号。

int NumRow = 3;    
int NumCol = 2;
int [] matrix = new int [NumRow][NumCol];

for ( int i = 0; i < NumRow; i++) 
{
    max = matrix[i][0];

    for ( int j = 1; j < NumCol; j++) 
    {
        if (matrix[i][j]> max) 
        {
            max = matrix[i][j];
        }
    }
    System.out.print(max+"  ");

}
System.out.println("\n");

for ( int c = 0; c < NumCol; c++)
{
    largest = matrix[c][0];

    for (int r = 0; r < NumRow; r++){
        if (matrix[r][c] > largest){
            largest = matrix[r][c];
        }
    }
    System.out.print(largest+"  ");   
}      

输出结果为:

7 3 8

7 8

现在我想使用上面的定义找到鞍点。

2 个答案:

答案 0 :(得分:3)

来自wikipedia(强调我的):

  

鞍点是矩阵的一个元素,它是最大   列中的元素和行中的最小元素。

您可以通过按行顺序遍历矩阵来确定它:

  • 创建一个数组来存储当前列的最大值

  • 动态存储当前行 - 最小并将其存储在数组中

完成此操作后,您可以比较两个索引是否同时出现,以便您拥有一个同时具有column-max和row-min的索引。

注意:根据维基百科的定义,你的示例矩阵没有任何鞍点。

答案 1 :(得分:1)

不幸的是我得走了。看起来你最终会到达那里。 这是一个基于您的描述的解决方案,您描述它的方式应该有效。

这不是最有效的,你应该改进它。你也不应该把它作为作业提交,这样做只会欺骗自己,你会发现未来的作业很难。

public class SaddlePointerFinder{

    public static void main(String[] args){

       int [] [] matrix = {   
        { 7, 2 },
        { 1, 3 },
        { 5, 8 },
       };

       // i loops though columns
       for(int x = 0; x<matrix[0].length; x++){    

       // this is to store the highest on the ROW
        int highestOnTheRow = -1;
       // this is to store the index of that highest value
       int indexOfHighest = -1;

       // x loops through rows
       for(int y = 0; y<matrix.length; y++){
            if(matrix[y][x] > highestOnTheRow) {
                // update the highest
                highestOnTheRow = matrix[y][x];
                indexOfHighest = y;
            }
        }

        // After checking the whole row and finding the highest, check if it's highest on the column
        boolean highest = true;

        // here, i checks goes through each row using that column.
        for(int i = 0; i<matrix[0].length; i++){
            if(matrix[indexOfHighest][i] > highestOnTheRow) {
                // one which was higher was found :(
                highest = false;
            }
        }
        if(highest){
               System.out.println("If the forumla is correct, this is a saddle point: " + highestOnTheRow);
        }
    }
}