代码适用于 3*3 或更大的矩阵,根据算法第 4 版书籍练习的练习开发。
它的工作原理如下
- 寻找给定矩阵的中间行并从中找到最小值
- 对于该最小值,请查找上方和下方元素以确保它是局部最小值
- 如果不限制搜索矩阵
- Row :选择比中间行元素小的元素所在的行的一半。
- colmun :选择在该行中找到最小值的索引。
- 重复步骤 1-3
公共类MinimumOfMatrix {
private static int findLocalMinimum(int[][] matrix, int rowStart, int rowEnd, int colStart, int colEnd) {
int midRow = (rowStart + rowEnd) / 2;
int minPos = findMin(matrix, midRow, colStart, colEnd);
if (minPos >= (colStart + colEnd) / 2)
colStart = (colStart + colEnd) / 2;
else
colEnd = (colStart + colEnd) / 2;
if (matrix[midRow][minPos] < matrix[midRow + 1][minPos]
&& matrix[midRow][minPos] < matrix[midRow - 1][minPos]) {
return matrix[midRow][minPos];
} else if (matrix[midRow][minPos] > matrix[midRow + 1][minPos]) {
return findLocalMinimum(matrix, midRow, rowEnd, colStart, colEnd);
} else {
return findLocalMinimum(matrix, rowStart, midRow, colStart, colEnd);
}
}
private static int findMin(int[][] matrix, int midRow, int colStart, int colEnd) {
int min = Integer.MAX_VALUE;
int pos = -1;
for (int i = colStart; i < colEnd; i++) {
if (matrix[midRow][i] < min) {
min = matrix[midRow][i];
pos = i;
}
}
return pos;
}
public static void main(String[] args) {
// Best Case
/*
* int[][] matrix= { {1,-2,4,-6,1,8}, {-3,-6,-8,8,1,3}, {1,2,6,-2,-8,-6},
* {-2,9,6,3,0,9}, {9,-1,-7,1,2,-6}, {-9,0,8,7,-6,9} };
*/
// Two Iteration Down Case
/*
* int[][] matrix= { { 1,-2, 4,-6, 1, 8}, {-3,-6,-8, 8, 1, 3}, { 1, 2, 6, 9, 0,
* 6}, {-2, 9, 6,-1,-1, 9}, { 9,-1,-7, 1, 2,-6}, {-9, 0, 8, 7,-6, 9} };
*/
/*
* //Left Down Case int[][] matrix= { { 1,-2, 4,-6, 0, 8}, {-3,-6,-8, 8,-2, 3},
* {-2, 9, 6,-1, 1, 9}, { 1, 0, 6, 9, 2, 6}, { 9,-1,-7, 1, 2,-6}, {-9, 0, 8,
* 7,-6, 9} };
*/
int[][] matrix = { { 1, -2, 4, }, { -3, -6, -8, }, { -2, 9, 6, }
};
System.out.println(findLocalMinimum(matrix, 0, matrix.length, 0, matrix.length));
}
}