題目描述
在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
直接上代碼
import java.util.Scanner;
public class Exam1 {
public static void main(String[] args){
int[][] a =
{
// {}
{1, 3, 5},
{2, 4, 6},
{7, 8, 9}
};
for(int i=0;i<a.length;i++){
for(int j=0;j<a[0].length;j++){
System.out.print(a[i][j]);
System.out.print(" ");
}
System.out.println();
}
Scanner scan = new Scanner(System.in);
while(scan.hasNext()) {
int target = scan.nextInt();
System.out.println(mySearch2D(a, target));
}
}
public static boolean mySearch2D(int[][] a, int target) {
// 按行掃描
for (int i = 0; i < a.length; i++) {
// 在每一行裏使用二分查找
int left = 0;
int right = a[i].length - 1;
int mid = 0;
if(right > 0){// right < 0 表示該行數組爲空,直接跳過進入下一行
while (left < right) {
mid = left + (right - left) / 2;
if (target == a[i][mid]) {
return true;
} else if (target < a[i][mid]) {
right = mid - 1;// isDescend=0
} else {
left = mid + 1;// isDescend=0
}
}
// 查找完畢,索引left所在位置即爲查找對象
// 如果與對象不相等,則對象不再序列中
// 此處可能產生數組越界異常,原因如果是空數組{{}},則left<0
if (target == a[i][left]) {
return true;
}
}
}
// 所有行內均沒找到
return false;
}
}
演示結果
補充描述
本次二維數組的查詢算法思路是,依次掃描數組的行,在行內使用二分查找,找到目標返回true,否則掃描下一行,如果全部掃描完成,即沒有找到目標,返回false。
算法的最差情況需要掃描所有行,因此還可以優化完善。
本題測試實例包括空數組{{}},因此要注意數組越界異常。