日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【千字过程分析】剑指 Offer 04. 二维数组中的查找

發布時間:2024/2/28 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【千字过程分析】剑指 Offer 04. 二维数组中的查找 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

立志用最少的代碼做最高效的表達


在一個 n * m 的二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個高效的函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
示例:

現有矩陣 matrix 如下:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
給定 target = 5,返回 true。
給定 target = 20,返回 false。

限制:
0 <= n <= 1000
0 <= m <= 1000


解法一:暴力

直接遍歷該二維數組,判斷這個值在數組中是否存在即可。

class Solution { public:bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {for(int i = 0; i < matrix.size(); i++) {for(int j = 0; j < matrix[i].size(); j++) {if(matrix[i][j] == target) {return true;}}}return false;} };

解法二:線性查找(雙指針法)

例如下面的二維數組就是每行、每列都遞增排序。如果在這個數組中查找數字7,則返回true;如果查找數字5,由于數組不含有該數字,則返回false。

在分析這個問題的時候,很多應聘者都會把二維數組畫成矩形,然后從數組中選取一個數字,分3種情況來分析查找的過程。

  • 當數組中選取的數字剛好和要查找的數字相等時,就結束查找過程。
  • 如果選取的數字小于要查找的數字,那么根據數組排序的規則,要查找的數字應該在當前選取位置的右邊或者下邊,如圖2.1 (a)所示。
  • 同樣,如果選取的數字大于要查找的數字,那么要查找的數字應該在當前選取位置的上邊或者左邊,如圖2.1 (b)所示。

    注:在數組中間選擇一個數(深色方格),根據它的大小判斷要查找的數字可能出現的區域(陰影部分)。
    在上面的分析中,由于要查找的數字相對于當前選取的位置有可能在兩個區域中出現,而且這兩個區域還有重疊,這問題看起來就復雜了,于是很多人就卡在這里束手無策了。

當我們需要解決一個復雜的問題時,一個很有效的辦法就是從一個具體的問題入手,通過分析簡單具體的例子,試圖尋找普遍的規律。

針對這個問題,我們不妨也從一個具體的例子入手。下面我們以在題目中給出的數組中查找數字7為例來一步步分析查找的過程。

前面我們之所以遇到難題,是因為我們在二維數組的中間選取一個數字來和要查找的數字進行比較,這就導致下一次要查找的是兩個相互重疊的區域。如果我們從數組的一個角上選取數字來和要查找的數字進行比較,那么情況會不會變簡單呢?

首先我們選取數組右上角的數字9。由于9大于7,并且9還是第4列的第一個(也是最小的)數字,因此7不可能出現在數字9所在的列。

于是我們把這一列從需要考慮的區域內剔除,之后只需要分析剩下的3列,如圖2.2( a)所示。在剩下的矩陣中,位于右上角的數字是8。同樣8大于7,因此8所在的列我們也可以剔除。接下來我們只要分析剩下的兩列即可,如圖2.2 (b)所示。

在由剩余的兩列組成的數組中,數字2位于數組的右上角。2小于7,那么要查找的7可能在2的右邊,也可能在2的下邊。在前面的步驟中,我們已經發現2右邊的列都已經被剔除了,也就是說7不可能出現在2的右邊,因此7只有可能出現在2的下邊。

于是我們把數字2所在的行也剔除,只分析剩下的三行兩列數字,如圖2.2(c)所示。在剩下的數字中,數字4位于右上角,和前面一樣,我們把數字4所在的行也刪除,最后剩下兩行兩列數字,如圖2.2(d)所示。

在剩下的兩行兩列4個數字中,位于右上角的剛好就是我們要查找的數字7,于是查找過程就可以結束了。

代碼

class Solution { public:bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {int row_len = matrix.size(), col_len = 0;if(!matrix.empty()) col_len = matrix[0].size();int now_row = 0, now_col = col_len-1;while(1) {if(now_row >= row_len || now_col < 0) break;if(target == matrix[now_row][now_col]) return true;else if(target < matrix[now_row][now_col]) now_col--;else if(target > matrix[now_row][now_col]) now_row++;}return false;} };

本題考點

考察應聘者對二維數組的理解及編程能力。二維數組在內存中占據連續的空間。在內存中從上到下存儲各行元素,在同一行中從左到右的順序存儲。
因此我們可以根據行號和列號計算出相對于首地址的偏移量,從而找到對應的元素。
考查應聘者分析問題、發現規律、解決問題的能力。
這道題只要從一個具體的二維數組的右上角開始分析,找到查找的規律,從而找到解決問題的突破口

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的【千字过程分析】剑指 Offer 04. 二维数组中的查找的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91av视频在线免费观看 | 亚洲精品成人片在线观看精品字幕 | 一级全黄裸体免费观看视频 | 国产模特av私拍大尺度 | 一区二区啪啪啪 | 国内久久精品视频 | 午夜影院日本 | 少女逼逼| 91午夜在线| 一区二区传媒有限公司 | 一区免费在线 | 日韩国产在线播放 | 色欲一区二区三区精品a片 在线观看黄网站 | 男女拍拍拍| 成人性生交免费看 | 国产精品热 | 日本中文字幕久久 | 国产九九精品视频 | 欧美性大战久久久久久久 | 青青操在线视频 | 色乱码一区二区三区在线男奴 | 亚洲第一黄色网址 | 国产91热爆ts人妖在线 | 开心成人激情 | 韩国美女视频在线观看18 | 亚洲一区你懂的 | 老妇女玩小男生毛片 | 欧美精品中文 | 日本在线视频免费观看 | 国产欧美一区二区精品性色99 | 久久综合一区二区 | 亚洲精品污一区二区三区 | 成年人性生活免费视频 | 波多野结衣一二区 | 看av网站 | 亚洲free性xxxx护士白浆 | 国产精品无码成人片 | 久久综合激的五月天 | 色哟哟入口国产精品 | 亚洲一区二区免费在线观看 | 亚洲av无码一区二区乱子仑 | 久久精品—区二区三区舞蹈 | 亚洲最大网站 | 五月天黄色网 | 欧美与黑人午夜性猛交久久久 | 美国色视频 | 国产美女一区二区 | 国产自产在线视频 | 欧美色图第一页 | 理论片第一页 | 在线观看视频毛片 | 国产精品久久久久久久久岛 | 亚洲人成人一区二区在线观看 | 国产精品视频免费播放 | 理论片午午伦夜理片影院99 | 久久国产网 | 亚洲高清在线 | 成人小视频免费在线观看 | 69免费视频 | 一区二区三区欧美日韩 | av免费观看网址 | 精品伦精品一区二区三区视频密桃 | 色妞综合 | 国产精品久久亚洲 | 不卡的av | 国产精品免费视频一区二区 | 免费看aaaaa级少淫片 | 一道本久在线中文字幕 | 天天碰免费视频 | 国产精品无码电影 | 欧美激情第1页 | www..99热 | 全国男人的天堂网 | aaaaaav| 黄色片网站在线免费观看 | 人妻丰满熟妇无码区免费 | 越南性xxxx精品hd | 在线免费激情视频 | 亚洲精品传媒 | 波多野结衣中文字幕一区 | 不卡影院av | 日日日日日日 | 抱着老师的嫩臀猛然挺进视频 | 欧美456 | 美女裸片| 亚洲欧美精品午睡沙发 | 日本成人中文字幕 | 国产成人无码精品久在线观看 | 欧美3p在线观看 | 国产一级久久 | 国产女人18水真多毛片18精品 | 国产精品久久777777换脸 | 纯爱无遮挡h肉动漫在线播放 | 午夜国产福利视频 | 99热网址| japan粗暴video蹂躏 | 进去里视频在线观看 | 一本色道久久亚洲综合精品蜜桃 | 日本成人黄色 |