【劍指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