Facebook面試題3 | Search a 2D Matrix II

專欄 | 九章算法
網址 | www.jiuzhang.com程序員

題目描述 面試

在一個 m*n 整數矩陣中找到指定值 target。算法

這個整數矩陣有以下性質:數組

  1. 每行從左到右數值遞增
  2. 每列從上到下數值遞增

Example:微信

有以下矩陣:
優化

指定值 target = 5,返回True。
指定值 target = 20,返回False。3d

解題思路分析 code

1. 簡單粗暴法:掃描整個矩陣,找出要找的指定值。算法複雜度:O(m*n)。cdn

2. 能不能優化?必須能夠!根據矩陣的性質,會聯想到二分查找。要如何讓矩陣像數組那樣每次減小一部分不須要進行比較的呢?咱們分析一下二分查找算法,之因此每次能夠捨棄掉一半,是由於咱們經過中間的一個數(split_num)把數組分紅了兩部分,左邊部分都不大於 split_num,右邊部分都不小於 split_num。而後經過比較 target 跟 split_num 的大小能夠知道target在左邊仍是右邊,從而捨棄掉另一半。注意:切分後,左右兩部分跟切分前同樣都是一個數組,因此咱們才能繼續按照一樣的標準對被選取的那一半進行處理。面試技巧

1)如今數組變成了矩陣,要如何選取這個 split_num 呢?因爲在數組中,咱們取的是最中間的元素做爲 split_num,那麼在這裏咱們嘗試幾個處於矩陣中特殊位置、有可能切分矩陣的元素:

A. 矩陣中心位置:以上面爲例,取 matrix[2][2] = 9 這個元素,若 target < 9 那麼 target 在左上角的這個矩陣裏;但若是 target > 9,那麼 target 可能在 matrix[2][2] 的右邊,也可能在 matrix[2][2] 的下邊,這兩部分合起來造成一個相似 J 的形狀,並非一個矩陣,那麼接下來咱們便不能按照一樣的標準進行切分了。與上面說的二分查找算法的想法相違背。

B. 矩陣對角線位置:若是是在對角線上任意取一個元素,那麼狀況與上述一致,因此這個不可行。那嘗試對角線頂點元素?左上角 matrix[0][0] 和右下角 matrix[4][4] 的這兩個元素,由於是最小值和最大值,因此並不能起到切分的做用,一樣捨棄。而左下角 matrix[4][0] 和右上角 matrix[0][4] 這兩個元素呢?以左下角 matrix[4][0] = 18 爲例,若 target < 18,那麼 target 在 matrix[4][0] 上方的這個矩陣裏;若 target > 18,那麼 target 在 matrix[4][0] 右邊的這個矩陣裏。無論 target 在哪一邊,被選取的那部分都是一個矩陣!那咱們就能繼續在被選取的矩陣裏比較其左下角元素和 target 的大小,進而繼續縮小 target 所在的矩陣,直到找到 target!(同理,右上角這個元素也是可行的。)

2) 由此,咱們能夠用「左下角元素」或「右上角元素」做爲 split_num(我這裏就選擇了左下角元素):
a. 若是 target == 左下角元素(當前位置),那麼已經完成任務!
b. 若是target > 左下角元素 matrix[m][0],那麼與 matrix[m][0] 同一列的元素全都小於 target, target 位於右邊的矩陣 matrix[0..m][1..n]。
c. 若是 target < 左下角元素 matrix[m][0],那麼與 matrix[m][0] 同一行的元素全都大於 target, target 位於上邊的矩陣 matrix[0..m-1][0..n]。
d. 這個算法的複雜度是 O(m+n)。

參考代碼

Search A 2D Matrix-ii 參考程序

面試官角度分析

這道題若是可以答案O(m+n)就能夠拿到offer。

LintCode相關練習題

Search A 2D Matrix


推薦閱讀



歡迎關注個人微信公衆號:九章算法(ninechapter)。
精英程序員交流社區,按期發佈面試題、面試技巧、求職信息等

九章算法,IT教育領域的深耕者
九章算法,IT教育領域的深耕者
相關文章
相關標籤/搜索