1. 程式人生 > >【劍指Offer學習】【面試題3 :二維陣列中的查詢】

【劍指Offer學習】【面試題3 :二維陣列中的查詢】

題目:在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。

public class Test03 {
    /**
     * 在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。
     * 請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。
     * <p/>
     * 規律:首先選取陣列中右上角的數字。如果該數字等於要查詢的數字,查詢過程結束:
     * 如果該數字大於要查詢的數字,剔除這個數字所在的列:如果該數字小於要查詢的數字,剔除這個數字所在的行。
     * 也就是說如果要查詢的數字不在陣列的右上角,則每-次都在陣列的查詢範圍中剔除)行或者一列,這樣每一步都可以縮小
     * 查詢的範圍,直到找到要查詢的數字,或者查詢範圍為空。
     *
     * @param matrix 待查詢的陣列
     * @param number 要查詢的數
     * @return 查詢結果,true找到,false沒有找到
     */
    public static boolean find(int[][] matrix, int number) {

        // 輸入條件判斷
        if (matrix == null || matrix.length < 1 || matrix[0].length < 1) {
            return false;
        }

        int rows = matrix.length; // 陣列的行數
        int cols = matrix[1].length; // 陣列行的列數

        int row = 0; // 起始開始的行號
        int col = cols - 1; // 起始開始的列號

        // 要查詢的位置確保在陣列之內
        while (row >= 0 && row < rows && col >= 0 && col < cols) {
            if (matrix[row][col] == number) { // 如果找到了就直接退出
                return true;
            } else if (matrix[row][col] > number) { // 如果找到的數比要找的數大,說明要找的數在當前數的左邊
                col--; // 列數減一,代表向左移動
            } else { // 如果找到的數比要找的數小,說明要找的數在當前數的下邊
                row++; // 行數加一,代表向下移動
            }
        }

        return false;
    }

    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(find(matrix, 7));    // 要查詢的數在陣列中
        System.out.println(find(matrix, 5));    // 要查詢的數不在陣列中
        System.out.println(find(matrix, 1));    // 要查詢的數是陣列中最小的數字
        System.out.println(find(matrix, 15));   // 要查詢的數是陣列中最大的數字
        System.out.println(find(matrix, 0));    // 要查詢的數比陣列中最小的數字還小
        System.out.println(find(matrix, 16));   // 要查詢的數比陣列中最大的數字還大
        System.out.println(find(null, 16));     // 健壯性測試,輸入空指標
    }
}


執行結果:


相關推薦

Offer學習試題3 陣列查詢

題目:在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 public class Test03 { /** * 在一個二維陣列中,

Offer試題3陣列查詢Java版解法

題目:在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 第一種解法是全遍歷,這種方

leetcode 240. 搜尋矩陣 II陣列Medium&&Offer試題4陣列查詢

題目: 編寫一個高效的演算法來搜尋 m x n 矩陣 matrix 中的一個目標值 target。該矩陣具有以下特性: 每行的元素從左到右升序排列。 每列的元素從上到下升序排列。 示例: 現有矩陣 matrix 如下: [

offer試題陣列查詢

  題目描述 思路一:遍歷整個二維陣列 思路二:利用該二維陣列的特性(時間複雜度為O(n),因為每次比較都會去掉一行或一列) 思路三:二分法   題目描述 在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一

offer試題4陣列查詢

題目: 在一個二維陣列中,每一行都按照從左到右遞增的順序排列,每一列都按照從上到下遞增的順序排列。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 查詢規則:首先選取陣列中右上角的數字。如果該數字等於要查詢的數字,則查詢過程結束;如果

試題4陣列查詢

題目 在一個二維陣列中,每一行按照從左到右遞增的順序排序,每一列按照從上到下進行排序。求:輸入這樣一個二維陣列和一個整數,判斷陣列中是否有該整數。 #include <cstdio> bool FindNumber(int* numbers, in

第二章試題4陣列查詢

題目 在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 思路 根據已知條件

Offer學習所有試題匯總

tails 超過一半 奇數 正則表達式 detail 刪除 祖先 滑動窗口 翻轉單詞順序 劍指Offer學習   劍指Offer這本書已經學習完了,從中也學習到了不少的東西,現在做一個總的目錄,供自已和大家一起參考,學如逆水行舟,不進則退。只有不斷地學習才能跟上時候,跟得

Offer學習試題5 從尾到頭列印連結串列思路

方案一:(後進先出)遍歷連結串列,再從棧頂開始出個輸出結點的值,此時輸出的結點的順序已經反轉過來了。 先推進棧 再依次取出棧頂元素 方案二:遞迴。 判斷連結串列頭結點是否為空 將 next 結點作為下一次的實參 輸出當前棧頂元素。 缺點:當連結串

Offer學習所有試題彙總

劍指Offer學習   劍指Offer這本書已經學習完了,從中也學習到了不少的東西,現在做一個總的目錄,供自已和大家一起參考,學如逆水行舟,不進則退。只有不斷地學習才能跟上時候,跟得上技術的潮流! 目錄 第01-10題 第11-20題 第21-30題

Offer學習試題4 替換空格思路

題目: 請實現一個函式,將一個字串中的每個空格替換成“%20”。例如,當字串為We Are Happy,則經過替換之後的字串為We%20Are%20Happy。 思路: 遍歷的方向兩邊皆可。 若從後往前遍歷,新的字串需要反轉。 用 String 類的方法判斷字串

Offer學習試題5 從尾到頭列印連結串列

題目:輸入個連結串列的頭結點,從尾到頭反過來打印出每個結點的值。 public class Test05 { /** * 結點物件 */ public s

Offer學習試題26複雜連結串列的複製

題目:請實現函式ComplexListNode clone(ComplexListNode head),複製一個複雜連結串列。在複雜連結串列中,每個結點除了有一個next 域指向下一個結點外,還有一個sibling 指向連結串列中的任意結點或者null。

Offer學習試題56連結串列中環的入口結點

題目:一個連結串列中包含環,如何找出環的入口結點? 解題思路   可以用兩個指標來解決這個問題。先定義兩個指標P1和P2指向連結串列的頭結點。如果連結串列中環有n個結點,指標P1在連結串列上向前移動n步,然後兩個指標以相同的速度向前移動。當第二個指標

Offer學習試題60叉樹打印出多行

題目:從上到下按層列印二叉樹,同一層的結點按從左到右的順序列印,每一層列印一行。 解題思路   用一個佇列來儲存將要列印的結點。為了把二叉樹的每一行單獨列印到一行裡,我們需要兩個變數:一個變量表示在當前的層中還沒有列印的結點數,另一個變量表示下一次結

Offer學習試題50兩個結點的最低公共祖先

題目:求樹中兩個結點的最低公共祖先,此樹不是二叉樹,並且沒有指向父節點的指標。 樹的結點定義 private static class TreeNode { int val; List<TreeNode> childre

Offer學習試題67機器人的運動範圍

題目:地上有個m行n列的方格。一個機器人從座標(0,0)的格子開始移動,它每一次可以向左、右、上、下移動一格,但不能進入行座標和列座標的數位之和大於k的格子。 舉例分析   例如,當k為18時,機器人能夠進入方格(35,37),因為3+5+3+7=1

Offer學習試題31連續子陣列的最大和

題目:輸入一個整型陣列,數組裡有正數也有負數。陣列中一個或連續的多個整陣列成一個子陣列。求所有子陣列的和的最大值。要求時間複雜度為O(n)。 例子說明: 例如輸入的陣列為{1, -2, 3, 10, -4, 7, 2, -5},和最大的子陣列為{3,

Offer學習試題54表示數值的字串

題目:請實現一個函式用來判斷字串是否表示數值(包括整數和小數)。 例子說明   例如,字串“+100”,“5e2”,“-123”,“3.1416”及”-1E-16”都表示數值,但“12e”,”1a3.14”,”1.2.3”,”+-5”及“12e+5.

Offer學習試題18 樹的子結構

題目:輸入兩棵二叉樹A 和B,判斷B 是不是A 的子結構。 二叉樹結點的定義: /** * 二叉樹的樹結點 */ public static class BinaryTreeNode { int value; BinaryT