面試題 尋找矩陣中的極小值

2021-10-04 01:12:51 字數 1818 閱讀 9010

給定乙個n×n的矩陣,矩陣中包含n×n個_互不相同_的整數。

定義極小值:如果乙個數的值比與它相鄰的所有數字的值都小,則這個數值就被稱為極小值。

乙個數的相鄰數字是指其上下左右四個方向相鄰的四個數字,另外注意,處於邊界或角落的數的相鄰數字可能少於四個。

要求在o(nlogn)的時間複雜度之內找出任意乙個極小值的位置,並輸出它在第幾行第幾列。

本題中矩陣是隱藏的,你可以通過我們預設的int函式query來獲得矩陣中某個位置的數值是多少。

例如,query(a,b)即可獲得矩陣中第a行第b列的位置的數值。

注意:

矩陣的行和列均從0開始編號。

query()函式的呼叫次數不能超過(n+2)×⌈log2n⌉+n答案不唯一,輸出任意乙個極小值的位置即可。

資料範圍

1 ≤ n ≤ 300,矩陣中的整數在int範圍內。

輸入樣例:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
輸出樣例:
[0, 0]
​ 這道題我們通過二分的思想解決,我們假設乙個如下5 * 5的矩陣

1  2  3  4  5

6 7 8 9 10

11 12 13 14 15

16 17 18 19 20

21 22 23 24 25

​ 肉眼可見,我們直接就可以看出本矩陣的極小值是1,但是我們怎麼實現合格問題呢?

​ 我們先從中間列也就是第2列將矩陣分為兩部分,左和右,之後我們從中間列從上到下第乙個元素開始遍歷中間列,找到中間列的最小值,可以看到,最小值是3,隨後我們對比3的左右元素,如果這時3的左右元素都> 3,那很幸運,3就是矩陣的極小值,如果3的左右元素有< 3的,那麼我們只需要再次二分這半部分矩陣即可,因為這半部分矩陣中,一定存在極小值

​ 系統給我們提供了query(x, y)函式來獲取矩陣中(x, y)位置的元素,但是有使用次數限制,這裡的限制證明過程過於繁瑣,我們只需要盡量降低query(x, y)函式的使用次數即可

class solution 

}long left = mid ?

query

(k, mid -1)

: inf;

long right =

(mid +1)

< n ?

query

(k, mid +1)

: inf;

if(left > min && right > min)

return;if

(left < min)

r = mid -1;

else

l = mid +1;

}long min = inf;

for(

int i =

0; i < n; i++)}

return;}

};

面試演算法題 尋找矩陣的極小值

給定乙個 n n 的矩陣,矩陣中包含 n n 個 互不相同 的整數。定義極小值 如果乙個數的值比與它相鄰的所有數字的值都小,則這個數值就被稱為極小值。乙個數的相鄰數字是指其上下左右四個方向相鄰的四個數字,另外注意,處於邊界或角落的數的相鄰數字可能少於四個。要求在 o nlogn 的時間複雜度之內找出...

面試題 矩陣中的路徑

請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左 右 上 下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑就不能再次進入該格仔。例如,在下面的3x4的矩陣中包含一條字串 bfce 的路徑。但矩陣中不包含字串 abf...

面試題12 矩陣中的路徑

題目 請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有 字元的路徑。路徑可以從矩陣中任意一格開始,每一步可以在矩陣中向左 右 上 下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次進入 該格仔。例如在下面的3 4的矩陣中包含一條字串 bfce 的路徑 路徑中的字 母用下劃線...