二維數組中的查找,待完善

二維數組中的查找,待完善

題目描述

在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。

直接上代碼

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。

算法的最差情況需要掃描所有行,因此還可以優化完善。

本題測試實例包括空數組{{}},因此要注意數組越界異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章