解题思路:
代码实现:
public class SortedMatrixElementFinder {
public static boolean find(int element, int[][] matrix) {
SortedMatrix theMatrix = new SortedMatrix(matrix);
int topRightElement = theMatrix.getTopRightElement();
while (topRightElement != element) {
if (element < topRightElement)
theMatrix.excludeThisCol();
else if (element > topRightElement)
theMatrix.excludeThisRow();
if (!theMatrix.isLegalIndex())
return false;
topRightElement = theMatrix.getTopRightElement();
}
return true;
}
private static class SortedMatrix {
private int[][] matrix;
private int currentCol;
private int currentRow;
public int getTopRightElement() {
return this.matrix[currentRow][currentCol];
}
public void excludeThisRow() {
currentRow++;
}
public boolean isLegalIndex() {
return currentCol >= 0 && currentRow >= 0;
}
public void excludeThisCol() {
currentCol--;
}
public SortedMatrix(int[][] matrix) {
if (matrix.length < 1 || matrix[0].length < 1)
throw new IllegalArgumentException();
this.matrix = matrix;
currentRow = 0;
currentCol = matrix[0].length - 1;
}
}
}
测试代码:
import junit.framework.Assert;
import org.junit.Test;
import algorithm.SortedMatrixElementFinder;
public class FindElementInSortedMatrix {
private int[][] matrix = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
@Test
public void elementExist(){
Assert.assertEquals(true, SortedMatrixElementFinder.find(6, matrix));
}
@Test
public void elementNotExist(){
Assert.assertEquals(false, SortedMatrixElementFinder.find(3, matrix));
}
}
代码已通过测试,欢迎大家就代码的任何问题提出建议,共同进步~~
注:题目来源于<<剑指offer>>