鞍点:行中最大,列中最小,只有一个鞍点(百度没查不到,个人认为)
1.在一个方法里实现(第一次写),结构不清楚,不容易理解
解题基本思路:
-
找一行中最大值,有两个最大值不算,只能是一个最大值
-
找到行最大值后,通过最大值下标,计较最大值所在的列的所有元素看是否是列中最小
-
如果是则是鞍点,不是则继续循环
public static void sadPoint(int[][]data) {
/**
* 结构:
* //第一个for用于一行一行循环,找每一行最大值和最大值所在的最小值比较
* for(){
* //第二个for,找到一行中的最大值,并传出最大值的列数
* for(){}
*
* //第三个for,找最大值列的最小值,并传出行数
* for(){}
*
* //比较传出的行数是否==最大值的行数,如果是则是鞍点跳出循环,不是继续循环
* if(){}
*
* }
*
*/
for (int i = 0; i < data.length; i++) {
//max用来存储最大值,maxRow,maxList用来存储下标
int max = data[i][0] ;
int maxRow = i ,maxList = 0 ;
//循环判断一行中的所有值,找出最大值给max
for (int j = 0; j < data[i].length; j++) {
if(max < data[i][j]) {
max = data[i][j] ;
maxRow = i ;
maxList = j ;
}
}
//同上找最小值,通过maxList传出的值,找最大值所在的列的最小值
int min = data[0][maxList] ;
int minRow = 0 ;
for (int j2 = 0; j2 < data.length; j2++) {
if(min > data[j2][maxList]) {
min = data[j2][maxList] ;
minRow = j2 ;
}
}
//比较最大值所在的列的最小值的行数是否==最大值的行数
if(maxRow==minRow) {
System.out.println("找到鞍点!");
System.out.println(maxRow+"行"+maxList+"列是鞍点为:"+max);
break;
}
}
}