SaddlebackSearch查找,用于二维有序数组。从上到下递增,从左到右递增。从左下角第一个元素(当前列值最大,当前行值最小)对比。如果目标值大于当前值,那么这一列的值都可以排除;如果目标值小于当前值,那么这一行的值都可以排除。排除像马鞍式一样。
时间的复杂度就是O(row + col),就是行数+列数。
Java代码示例:
private int[] find(int arr[][], int row, int col, int key) {
int ans[] = {-1, -1};
if (row < 0 || col >= arr[row].length) {
return ans;
}
if (arr[row][col] == key) {
ans[0] = row;
ans[1] = col;
return ans;
} else if (arr[row][col] > key) {
return find(arr, row - 1, col, key);
}
return find(arr, row, col + 1, key);
}
/**
* 循环迭代
* 在二维数组中查询目标对象
* @param arr 数组
* @param row 行
* @param col 列
* @param key 目标对象
* @param <T> 泛型
* @return 查找结果
*/
private <T extends Comparable<T>> int[] saddlebackFind(T[][] arr, int row, int col, T key){
int[] rowCol = {-1 ,-1};
while (row >= 0 && col >=0){
int cmpResult = arr[row][col].compareTo(key);
if (cmpResult == 0){
rowCol[0] = row;
rowCol[1] = col;
return rowCol;
}else if (cmpResult > 0){
row --;
}else {
col ++;
}
}
return rowCol;
}