1. 程式人生 > >劍指off:在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣一個二維陣列和一個整數,判斷陣列中是否含有該整數

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

題目描述

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

思路:

從左下角x開始尋找,x為此列最大數字,此行最小數字。如果目標數小於x,則這一行消除。如果目標數大於x,此列消除。迴圈當找到或者不存在停止

程式碼:

 bool Find(int target, vector<vector<int>> array)
    {
        int rowcount = array.size();//行數
        int colcount = array[0].size();//列數
        int i, j;
        for (i = rowcount - 1, j = 0; i >= 0 && j < colcount;)//從左下角開始遍歷
        {
            if (target == array[i][j])
            {
                return true;
            }

            if (target < array[i][j])//目標數比當前數小,從上一行繼續查詢
            {
                --i;
                continue;
            }
            if (target > array[i][j])//目標數比當前數大,從下一列開始查詢
            {
                ++j;
                continue;
            }
        }
        return false;
    }
};

測試:

int main()
{
    vector<vector<int>> array = { {1,2,8,9},{2,5,9,10},{4,7,10,12},{6,8,11,13} };
    int i = 7;
    Solution s;
    if (s.Find(i, array))
    {
        cout << "true" << endl;
    }
    else
        cout << "false" << endl;
}