每日一題 二維陣列中的查詢

2021-08-22 19:49:47 字數 1087 閱讀 9830

題目

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

array: 待查詢的二維陣列

target:查詢的數字

輸出描述

查詢到返回true,查詢不到返回false

思路一:二維陣列遍歷

直接遍歷二維陣列,複雜度為o(n^2),複雜度太高,不採納

思路二:二分查詢

根據該二維陣列的特徵,即行、列有序,我們可以首先想到使用二分查詢,但這裡是二維陣列,至少要遍歷一遍陣列的長度,對每一行或者每一列進行二分查詢,此時的時間複雜度將近是o(nlogn),我們可以繼續優化。

二分查詢的過程中,會產生一棵二叉判定樹,二叉判定樹的特點就是,左子樹小於根節點,右子樹大於根節點。利用這個性質,我們可以將二維陣列模擬成乙個二叉判定樹,此時就需要找出根節點,使得左子樹小於根節點,右子樹大於根節點,並且它的孩子節點也符合這種特性。根據給定條件,可以看到有兩個點符合要求,即左下角和右上角。

以左下角來說,往上數值遞減,相當於左子樹,往右遞增,相當於右子樹。所以,我們可以定義左右兩個指標,初始時指向左下角節點作為根節點,當我們需要查詢的數字比當前陣列節點大的時候,右指標往右移一位,當需要查詢的數字小於當前節點時,左指標往上移一位。

思路三:

從陣列中選取數字,和目標數字的關係有三種情況:=,《或》。

如果是等於則查詢成功;

如果是陣列中元素小於要查詢的數字,說明要查詢的數字應該在當前位置的右邊或下邊。

如果是陣列中元素大於要查詢的數字,說明要查詢的數字應該在當前位置的左邊或上邊。

但是這兩個區域還有可能有重疊,比如右邊或下邊會在右下角有重疊。

解決方法:

如果查詢從右上角開始,如果要查詢的數字不在右上角,則每次可以剔除一列或一行。

也可以從左下角開始,但是不能從左上角或者右下角開始。

每日一題10 在排序的二維陣列中查詢

排序的二維陣列是這樣的 在每一行中元素是遞增的,在每一列中元素也是遞增的,比如 11 34 35 47 51 13 37 40 52 61 19 42 50 79 80 給定乙個值,判斷其是否在這樣排序的二維陣列中。首先,先來生成測試資料,思路如下 1 先選擇一種將給定輸入按公升序排列。2 構造乙個...

劍指offer 二維陣列查詢 每日一題

在乙個二維陣列中,每一行都按照從左到右遞增的順序排列,每一列都按照從上到下遞增順序排列。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。測試用例 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 查詢7輸出 9,因為9 4 2 1 第三行第二列 根...

每日刷題 二維陣列中的查詢

在乙個 n m 的二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。例 現有矩陣 matrix 如下 1,4,7,11,15 2,5,8,12,19 3,6,9,16,22 10,13,14...