劍指offer - 二維數(shù)組中的查找

題目

在一個二維數(shù)組中稼稿,每一行都按照從左到右遞增的順序排序苔咪,每一列都按照從上到下遞增的順序排序漓概。請完成一共函數(shù),輸入這樣的一個二維數(shù)組和一個整數(shù)阔墩,判斷數(shù)組中是否含有該整數(shù)

例如下面的二維數(shù)組就是每行嘿架、每列都遞增排序。如果在這個數(shù)組中查找數(shù)字7啸箫,則返回true耸彪,如果查找數(shù)字5,由于數(shù)組不含有該數(shù)字忘苛,則返回false

1 2 8 9 
2 4 9 12
4 7 10 13
6 8 11 15

分析

1.jpg

首先我們選取數(shù)組右上角的數(shù)字9蝉娜,由于9大于7,并且9還是第4列的第一個(也是最小的)數(shù)字扎唾,因此7不可能出現(xiàn)在數(shù)字9所在的列召川。于是我們把這一列從需要考慮的區(qū)域內剔除,之后需要分析剩下的3列胸遇。

在所剩下的矩陣中荧呐,位于右上角的數(shù)字是8,同樣8大于7纸镊,因此8所在的列我們也可以剔除倍阐。接下來我們只要分析剩下的2列即可。

在剩下的2列中逗威,數(shù)字2位于數(shù)組的右上角峰搪,2小于7,那么要查找的7可能在2的右邊也可能在下邊凯旭,在前面的步驟中概耻,我們已經將2右邊的列都已經被剔除了使套,也就是說2只能是出現(xiàn)在2的下邊,于是我們把2所在的行剔除鞠柄。在剩下的數(shù)字中侦高,數(shù)字4位于又上角,由于4小于7春锋,同樣剔除4所在的行矫膨。

在剩下的2行中,位于右上角的數(shù)字7正好是我們要查找的期奔,于是查找過程結束。

總結上面查找的過程

我們可以發(fā)現(xiàn)規(guī)律危尿,首先選取數(shù)組中右上角的數(shù)字呐萌,如果該數(shù)字等于要查找的數(shù)字,則查找結束谊娇;如果該數(shù)字大于要查找的數(shù)字肺孤,則剔除這個數(shù)字所在的列;如果該數(shù)字小于要查找的數(shù)字济欢,則剔除數(shù)字所在的行赠堵。

也就是說,如果要查找的數(shù)字不在數(shù)組的右上角法褥,則每一次都在數(shù)組的查找范圍剔除一行或者一列茫叭,這樣每一步都可以縮小查找的范圍,直到找到要查找的數(shù)字半等,或者查找范圍為空

算法從右上角元素開始比較

如果相等就返回揍愁;如果大于則列減少,否則行增加

bool Find(int* matrix, int rows, int columns, int number)
{
    bool found = false;

    if(matrix != nullptr && rows > 0 && columns > 0)
    {
        int row = 0;
        int column = columns - 1;
        while(row < rows && column >=0)
        {
            if(matrix[row * columns + column] == number) // 使用指針獲取二維數(shù)組的值進行比較
            {
                found = true;
                break;
            }
            else if(matrix[row * columns + column] > number)
                -- column;
            else
                ++ row;
        }
    }

    return found;
}

二維數(shù)組在內存中占據連續(xù)的空間杀饵,在內存中從上到下存儲各行元素莽囤,在同行中按照從左到右的順序存儲,因此我們可以根據行號和列號計算出相當于數(shù)組首地址的偏移量

使用二維數(shù)組

bool find(int target, vector<vector<int>> array)
{
   int rows = array.size();     // 矩陣行
   int cols = array[0].size();  // 矩陣列數(shù)
   bool found = false;
   if (rows > 0 && cols > 0)
   {
       int row = 0;        // 第一行
       int col = cols - 1; // 最后一列
       while (row < rows && col >= 0) {
           if (array[row][col] == target) // 當前值跟目標值相等正好找到
           {
             found = true;
             break;
           }
           else if (array[row][col] > target) // 當前值比目標值大
                 --col;
            else
                 ++row;
            }
        }
        return found;
 }

算法從左下角開始比較

相等就返回切距;若大于則列增加朽缎,否則行減少

bool find1(int target, vector<vector<int>> array)
{
   int rows = array.size();
   int cols = array[0].size();
   bool found = false;
   if (rows > 0 && cols > 0)
   {
       int row = rows - 1; // 最后一行
       int col = 0;                  // 第一列
       while (row >= 0 && col < cols)
       {
          if (array[row][col] == target)
          {
               found = true;
               break;
           }
          else if (array[row][col] > target)
               --row;
          else
               ++col;
         }
      }
        return found;
  }

暴力解法,兩層for循環(huán)

bool Find(vector<vector<int> > array,int target)
{
    int row = 0, col = 0, t = 0;
    bool isFound = false;

    for(int i = 0; i < array.size( ) ; ++i)
    {
        for(int j = 0; j < array[i].size( ); ++j)
        {
            //邊輸入邊驗證
            if(false == isFound && target == array[i][j])
            {
                //已經找到后就沒必要再找了
                isFound = true;
            }
         }
     }
     return isFound;
}

參考

《劍指offer》

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末谜悟,一起剝皮案震驚了整個濱河市话肖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赌躺,老刑警劉巖狼牺,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異礼患,居然都是意外死亡是钥,警方通過查閱死者的電腦和手機掠归,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悄泥,“玉大人虏冻,你說我怎么就攤上這事〉簦” “怎么了厨相?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鸥鹉。 經常有香客問我蛮穿,道長,這世上最難降的妖魔是什么毁渗? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任践磅,我火速辦了婚禮,結果婚禮上灸异,老公的妹妹穿的比我還像新娘府适。我一直安慰自己,他們只是感情好肺樟,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布檐春。 她就那樣靜靜地躺著,像睡著了一般么伯。 火紅的嫁衣襯著肌膚如雪疟暖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天蹦狂,我揣著相機與錄音誓篱,去河邊找鬼。 笑死凯楔,一個胖子當著我的面吹牛窜骄,可吹牛的內容都是我干的。 我是一名探鬼主播摆屯,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼邻遏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了虐骑?” 一聲冷哼從身側響起准验,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎廷没,沒想到半個月后糊饱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡颠黎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年另锋,在試婚紗的時候發(fā)現(xiàn)自己被綠了滞项。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡夭坪,死狀恐怖文判,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情室梅,我是刑警寧澤戏仓,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站亡鼠,受9級特大地震影響赏殃,放射性物質發(fā)生泄漏。R本人自食惡果不足惜拆宛,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一嗓奢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浑厚,春花似錦、人聲如沸根盒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炎滞。三九已至敢艰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間册赛,已是汗流浹背钠导。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留森瘪,地道東北人牡属。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像扼睬,于是被迫代替她去往敵國和親逮栅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內容