給定乙個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 的路徑 路徑中的字 母用下劃線...