1. 程式人生 > >【劍指offer】二維數組中的查找

【劍指offer】二維數組中的查找

title href 大數 return () 就是 最小 對角線 length

題目鏈接:二維數組中的查找

題意:在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。

題解:這道題最容易想到的是o(n*m)的算法。[順便BB一句,我參加17年的牛客的Google girl的面試時,面試官就出了這個題。] 回看一下題目的條件,就會發現這個數組是一個很特殊的數組。

1 2 3

4 5 6

7 8 9

取一個比較極端的例子,可以看出來,左上角永遠是最小數,右下角永遠是最大數。我們把目標值定為target,以副對角線劃分,可以看出來小的在左邊,大的在右邊。也就是我們從右上角開始,如果target < a[i][j],那麽j--,如果target > a[i][j],那麽i++.這樣出來的復雜度就o(m+n)了。

代碼:

java

 1 public class Solution {
 2     public boolean Find(int target, int [][] array) {
 3         int col = array[0].length-1;
 4         int row = 0;
 5         while(col>=0 && row < array.length){
 6             if(array[row][col] == target){
 7                 return
true; 8 } 9 else if(array[row][col] > target){ 10 col--; 11 } 12 else{ 13 row++; 14 } 15 } 16 return false; 17 } 18 }

c++

 1 class Solution {
 2 public:
 3     bool
Find(int target, vector<vector<int> > array) { 4 int len = array[0].size(); 5 int col = len - 1; 6 int row = 0; 7 while(col >= 0 && row < len){ 8 if(array[row][col] == target){ 9 return true; 10 } 11 else if(array[row][col] < target){ 12 row++; 13 } 14 else{ 15 col--; 16 } 17 } 18 19 return false; 20 } 21 };

【劍指offer】二維數組中的查找