劍指offer-3.二維數組中查找
阿新 • • 發佈:2018-03-14
arr true cto brush 數組 分析 get gpo fin
0 題目
在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列按照從上到下遞增順序排序
請完成一個函數,輸入這樣一個二維數組和一個整數,判斷數組中是否含有這個整數。
1 分析
凡是數組有序的首先要想到的是二分查找。
這個二維數組的特點在於,數組中某個點,在該點,右、下方的數都比該數大。左、上的都比該數小。
但是同時判斷兩個相同維度,比較麻煩。
因此先判斷兩個不同的維度。也就是說,判斷某個點右面和下面,或是左面和上面。那麽其中一個方向是大的,另一個方向是小的。
以判斷右面和下面為例:
去左上的點開始,首先,如果目標數比當前點大,那麽向下移動,如果比目標點小,那麽向右面移動,此時點的右下就是帶選擇的區域,坐下就是篩選過的區域
bool find(int target, vector<vector<int>> array) { size_t rows = array.size(); if (rows == 0) { return false; } size_t cols = array[0].size(); if (cols == 0) { return false; } // col,和row 是右上的點 int col = cols - 1; int row = 0; // 點向左下移動,因此,col>=0, row < rows while (col >= 0 && row < rows) { if (target == array[row][col]) { return true; } else if (target < array[row][col]) // 大於,向下移動 { --col; } else if (target > array[row][col]) // 小於,向左移動 { ++row; } } return false; }
劍指offer-3.二維數組中查找