1. 程式人生 > >劍指offer-3.二維數組中查找

劍指offer-3.二維數組中查找

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.二維數組中查找