二維數(shù)組中的查找


題目要求:在一個(gè)二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請(qǐng)完成一個(gè)函數(shù),輸入這樣的一個(gè)二維數(shù)組和一個(gè)整數(shù),判斷數(shù)組中是否含有該整數(shù)。


思路:每次都選取數(shù)組查找范圍內(nèi)的 右(左)上角 數(shù)字,若該數(shù)字大于要查找的數(shù)字,則剔除該數(shù)字所在列(行); 若該數(shù)字小于要查找的數(shù)字,則剔除該數(shù)字所在行(列)。一步一步縮小查找范圍,直到找到該數(shù)字


代碼實(shí)現(xiàn):

/**
 * 問(wèn)題類(lèi)型:二維數(shù)組 
 *
 *  時(shí)間復(fù)雜度:O(M + N)
 *  空間復(fù)雜度:O(1)
 */
public class FindEleInTwoDimeArray {

    private static boolean find(int[][] matrix, int target) {

        boolean hasFound = false;  // 是否找到目標(biāo)數(shù)字標(biāo)記
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return hasFound;
        }

        int row = matrix.length; // 二維數(shù)組的行
        int col = matrix[0].length; // 二維數(shù)組的列(行的列數(shù))

        //int rowStart = 0, colStart = col - 1; // 從數(shù)組的右上角開(kāi)始
        int rowStart = row - 1, colStart = 0; // 從數(shù)組的左下角開(kāi)始

        // 在二維數(shù)組的范圍內(nèi)
        while (rowStart < row && colStart >= 0) {

            /**
             * 從左下角開(kāi)始找
             */
            if (matrix[rowStart][colStart] == target) {
                hasFound = true;
                break;
            } else if (matrix[rowStart][colStart] > target) {
                rowStart--; // 向上移動(dòng)
            } else {
                colStart++; // 向右移動(dòng)
            }

            /*// 判斷數(shù)組右上角數(shù)字與目標(biāo)數(shù)字是否相等
            if (matrix[rowStart][colStart] == target) {
                hasFound = true;
                break;
                // 大于則縮小列的范圍
            } else if (matrix[rowStart][colStart] > target) {
                colStart--; // 向左移動(dòng)
                // 小于則縮小行的范圍
            } else {
                rowStart++; // 向下移動(dòng)
            }*/
        }

        return hasFound;
    }

    public static void main(String[] args) {
        int[][] matrix = {
                {1, 2, 8, 9},
                {2, 4, 9, 12},
                {4, 7, 10, 13},
                {6, 8, 11, 15}
        };
        System.out.println("二維數(shù)組如下所示:");
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                System.out.print(matrix[i][j] + "   ");
            }
            System.out.println();
        }
        System.out.print("輸入要查找的數(shù)字:");
        Scanner input = new Scanner(System.in);
        int target = input.nextInt();
        System.err.println("是否找到: " + find(null, target)); // 輸入空指針,健壯性測(cè)試
        System.err.println("是否找到: " + find(matrix, target)); // 輸入數(shù)組包含的數(shù)字
        System.err.println("是否找到: " + find(matrix, target)); // 輸入數(shù)組不包含的數(shù)字
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.在一個(gè)二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請(qǐng)完成一個(gè)函數(shù),輸入...
    穿著拖鞋踢正步閱讀 1,034評(píng)論 0 1
  • 題目:在一個(gè)二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請(qǐng)完成一個(gè)函數(shù),輸...
    913c9536e19a閱讀 445評(píng)論 0 0
  • 問(wèn)題: 在一個(gè)二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請(qǐng)完成一個(gè)函數(shù),...
    Levi段玉磊閱讀 212評(píng)論 0 0
  • 題目: 在一個(gè)二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請(qǐng)完成一個(gè)函數(shù),...
    李2牛閱讀 401評(píng)論 0 0
  • 做個(gè)記錄吧,有什么錯(cuò)誤,希望大家?guī)兔χ刚幌???赡芪覍?xiě)的比較簡(jiǎn)單,有的東西沒(méi)有考慮到,也希望大家多多指正。謝謝啦~...
    playman閱讀 422評(píng)論 0 1

友情鏈接更多精彩內(nèi)容