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;
}