二維陣列中的查詢

2022-08-24 18:30:12 字數 3016 閱讀 8019

題目描述

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

題目分析

每一行、每一列都是遞增的。

解法

(一)二分法

對於有序陣列的查詢問題而言,二分法是最容易想到的乙個解法。在這裡,對每一行使用二分查詢,時間複雜度為 o(nlogn) 。二分查詢複雜度 o(logn),一共 n 行,所以總體的時間複雜度是 o(nlogn) 。

(二)規律法

根據二維陣列由上到下,由左到右遞增的規律。從左下角開始遍歷,如果當前值比 target 小則往右找,如果比 target 大則往上找,如果存在,必然可以找到目標數字。即選取右上角或者左下角的元素 a[row] [col] 與 target 進行比較, 當target小於元素 a[row] [col] 時,那麼 target 必定在元素 a 所在行的左邊,讓 col- ;當 target 大於元素 a[row] [col] 時,那麼 target 必定在元素 a 所在列的下邊,讓 row++ ;

**如下:

public

class

solution

return

false

; }

}

(二)二分規律法將解法一和解法二進行結合:對每行每列都使用二分查詢,此時的時間複雜度為 o(logn * logm)。

比如查詢數字 9,首先使用用二分查詢選出一行,總共有 5 行,那麼( 0 + 5 ) / 2 = 2,所以我們找出了第 2行為基準行。

接下來對這一行(即第 2 行)又使用二分查詢, 找出這一行(即第 2 行)中最後乙個比目標值小的值,這裡是 6。

左上部分(圖 7 灰色部分),包括所在行的左邊部分和所在列的上邊部分:這一部分是絕對不會有目標數字的。因為這部分數字肯定比 6 小,而 6 又是小於目標數字的,所以左上部分全部小於目標數字。也就是說這個區域的數字不需要再進行判斷了。

右下部分(圖 7 綠色部分),包括所在行的右邊部分,但不包括所在列的下面部分, 這一部分也是絕對不會有目標數字的。因為這部分都比 6 右邊的數字 11 大,而 11 又比目標數字 9 更大,所以右下部分全部都比目標數字大。也就是說這個區域的數字也不需要再進行判斷了。

左下部分(圖 7 藍色部分),可能含有目標數字。

右上部分(圖 7 棕色部分),可能含有目標數字。

這樣,實際上篩選的區域就只剩下左下部分(圖 7 藍色部分)和右上部分(圖 7 棕色部分)這兩塊區域了,相比於解法二而言,使用這種解法平均情況下每一次查詢,都可以把行和列的長度減少一半。

**如下:

public

class

solution

int h = array.length - 1

;

int w = array[0].length - 1

;

//如果目標值小於最小值 或者 目標值大於最大值,那肯定不存在

if (array[0][0] > target || array[h][w]

return binarysearchin2darray(array, target, 0, h, 0

, w);

}public

static boolean binarysearchin2darray(int array, int target, int startx, int endx, int starty, int

endy)

//首先,根據二分法找出中間行

int x = (startx + endx) / 2

;

//對該行進行二分查詢

int result =binarysearch(array[x], target, starty, endy);

//找到的值位於 x 行,result 列

if (array[x][result] ==target)

//對剩餘的兩部分分別進行遞迴查詢

return binarysearchin2darray(array, target, startx, x - 1, result + 1

, endy)

|| binarysearchin2darray(array, target, x + 1

, endx, starty, result);

}public

static

int binarysearch(int array, int target, int start, int

end)

else

if (array[i] >target)

else}}

二維陣列中查詢

1.問題描述 在乙個二維陣列中,每一行按照從左到右的遞增順序排序,每一列按照從上到下的遞增的順序排序,請完成這樣乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列是否含有該整數。來自 劍指offer 2.分析 首先選取陣列中右上角的數字。如果該數字等於要查詢的數字,查詢過程結束 如果該數字大於要查...

二維陣列中查詢

乙個二維陣列,每一行從左到右,每一列從上到下,都是按遞增順序排列,輸入乙個二維陣列和某個數,判斷陣列中是否存在這個數 排除行和列 比如從右上角元素出發。先確定列的範圍,如果查詢數大於當前列的第一行數,那麼這一行的所有數都大於查詢數,排除,繼續查詢左邊列 確定行範圍,在前面列的範圍內,如果最右邊元素小...

二維陣列中查詢

題目描述 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。思路解析 這是一道比較基礎的題,就是找二維陣列中的乙個數。方案一 暴力 function find target,array...