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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

《剑指Offer》——二维数组中的查找(JZ1)C++

發布時間:2025/4/5 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《剑指Offer》——二维数组中的查找(JZ1)C++ 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 前言
    • 題目:JZ1 二維數組中的查找
  • 一、暴力解法
  • 二、優化解法
  • 總結


前言

題目:JZ1 二維數組中的查找

在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
給定 target = 7,返回 true。


提示:以下是本篇文章正文內容,下面案例可供參考

一、暴力解法

代碼如下(示例):

/*** 暴力解法* 通過兩層循環查找所有的數去對比* 時間復雜度O(mn),最壞情況查找了m行,n列才找到* @param target* @param array* @return bool*/ class Solution { public:bool Find(int target, vector<vector<int> > array) {if(array.size()==0) return false; //判斷異常情況for(int i=0;i<array.size();i++) //兩層for循環查找{for(int j=0;j<array[0].size();j++){if(target==array[i][j]){ return true;}}}return false;} };

二、優化解法

代碼如下(示例):

/*** 利用二維數組由上到下,由左到右遞增的規律,* 那么選取左下角或者右上角的元素a[i][j]與target進行比較,* 當target大于元素a[i][j]時,那么target必定在元素a所在行的右邊,* 即j++;* 當target大于元素a[i][j]時,那么target必定在元素a所在列的上邊,* 即i--;* 時間復雜度m+n** @param target* @param array* @return*/ class Solution { public:bool Find(int target, vector<vector<int> > array) {if(array.size()==0||array[0].size()==0) //處理異常情況{return false;}int m = array.size(); //二維數組的行數mint n = array[0].size(); //二維數組的列數nint r=0,c=n-1; //從右上開始找while(r<m&&c>=0){if(target == array[r][c]){return true;}else if(target>array[r][c]){++r;}else{--c;}}return false;} };

總結

方法2:二分查找

分析:對于方法一,此題有額外信息沒有利用上,數組從左到右遞增,從上到下遞增。有序的數組很顯然應該想到二分。那么應該如何二分呢?
回想一下一維有序數組查找某個值二分的過程,如下圖所示:

假設目標tar在arr[1]處,那么我們的二分過程就是:
1)設初始值:定義一個二分的開始下標為l,結束下標為r,如圖所示:
2)二分一半,中間位置為 mid = l + ((r - l) >> 1), val>>1, 表示val右移一位相當于val/2,相當于 l+(r-l)/2,這樣的寫法是防止溢出。如果寫成 mid = (l+r)/2; l+r可能會溢出。
3) 如果 tar == arr[mid],說明找到tar
4)比較:如果tar > arr[mid], 說明tar在區間[mid+1, r]中,l = mid + 1
5)如果tar < arr[mid],說明tar在區間[l, mid-1]中, r = mid - 1
圖中的例子就是步驟4)的情況,一次比較之后,如圖所示,表示找到了tar。

錯誤的想法:將一維擴展到二維。照葫蘆畫瓢,

假設我們設二分的開始下標為左上角坐標(0,0)為上圖的l,結束下標為(4,5)為圖中的r,二分一次下標為(2,2)圖中的mid,假設tar > arr[mid],
由一維二分可知,接下來應該找大于arr[mid]的位置,可是根據圖可知,?處可能大于,也可能小于,所以就不能按照之前的規則進行二分了。所以說,這樣是錯的。

總結一下:錯誤的原因是:之前二分之后,無法確定下一次二分應該往哪邊分,由此無法進行二分下去。如果我們找個位置,每次都能確定的往哪個部分二分,即可達到我們想要的結果。

新想法
假設arr數組,val,tar如下圖所示:
如果我們把二分值定在右上角或者左下角,就可以進行二分。這里以右上角為例,左下角可自行分析:
圖片說明
1)我么設初始值為右上角元素,arr[0][5] = val,目標tar = arr[3][1]
2)接下來進行二分操作:
3)如果val == target,直接返回
4)如果 tar > val, 說明target在更大的位置,val左邊的元素顯然都是 < val,間接 < tar,說明第 0 行都是無效的,所以val下移到arr[1][5]
5)如果 tar < val, 說明target在更小的位置,val下邊的元素顯然都是 > val,間接 > tar,說明第 5 列都是無效的,所以val左移到arr[0][4]
6)繼續步驟2)

復雜度分析
時間復雜度:O(m+n) ,其中m為行數,n為列數,最壞情況下,需要遍歷m+n次。
空間復雜度:O(1)
應該完整考慮好題目給出的條件

總結

以上是生活随笔為你收集整理的《剑指Offer》——二维数组中的查找(JZ1)C++的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产一级二级视频 | 一级黄色免费大片 | 色中色综合 | 亚洲制服丝袜av | 九九九久久久精品 | 久久亚洲综合网 | 草碰在线视频 | 午夜爱爱影院 | 免费看一级片 | 久久精品成人av | 日韩无遮挡| 亚洲成人动漫在线观看 | 爱爱视频免费看 | 日本中文字幕一区 | 男男上床视频 | 人人搞人人 | 国产精品久久久久久中文字 | 麻豆视 | 天天爽天天射 | 精品无码久久久久国产 | 国产亚洲精品成人av久久ww | 免费的性爱视频 | 夜夜操夜夜干 | a级黄视频| 国产日产亚洲精品 | 被扒开腿一边憋尿一边惩罚 | 榴莲视频黄色 | 91成人国产综合久久精品 | 日韩精品啪啪 | 成人免费不卡视频 | 日本精品视频一区二区三区 | 免费高清av | 假日游船| 欧美三级视频在线 | 黄色一级片免费观看 | 日韩喷潮 | 男人资源网站 | 国产一区视频免费观看 | 欧美一区二区在线视频观看 | 久久国产经典 | 182tv福利视频 | 亚洲色图美腿丝袜 | 怡红院最新网址 | 女人的黄色片 | 日本黄色中文字幕 | 精品日韩欧美 | 日韩少妇一区二区 | 色77777| 毛片精品 | 久在线视频 | 操女人的逼逼 | 中文字幕人妻精品一区 | 手机看片欧美日韩 | 亚洲毛片一级 | 久久久久国产精品视频 | 黄色网在线播放 | 五月天男人天堂 | 麻豆免费网站 | 国精产品一区二区三区 | 色图自拍 | 高潮网| 成人午夜毛片 | 波多野结衣一区在线 | 久久久久久婷婷 | 免费黄色激情视频 | 麻豆久久久久久久久久 | 欧洲女性下面有没有毛发 | 欧美日韩中文字幕在线播放 | 人妻 校园 激情 另类 | 日韩精品在线视频免费观看 | 好看的黄色网址 | 日韩精品在线视频免费观看 | 精品国产一区二区不卡 | 久久婷婷亚洲 | 天天拍天天射 | 国产在线拍揄自揄拍 | 美国福利片 | 国产盗摄视频在线观看 | 亚洲每日在线 | 先锋av在线资源 | 国产精品jizz在线观看老狼 | 日本三级黄色大片 | 综合色影院 | 天天草视频 | 亚洲福利小视频 | 免费观看的毛片 | 大奶子网站 | 欧美人与性囗牲恔配 | 久久国产露脸精品国产 | 蜜桃视频中文字幕 | 黄页网站免费观看 | 青青青在线视频观看 | 五月综合色 | 中文字幕av免费 | 伊朗做爰xxxⅹ性视频 | 青青草国产一区二区三区 | 人人干人人澡 | 国产曰肥老太婆无遮挡 | 日本热久久 |