二維數組中的查找

題目描述

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

算法實現

從矩陣左下角元素開始,比它小的在它上面,比它大的數在它右邊。矩陣中所有元素都滿足這個性質,利用這個特性進行查找。算法複雜度O(nn)。

bool Find(int target, vector<vector<int> > array) {
    int h = array.size(), w = array[0].size();
    int y = h - 1, x = 0;
    int val;
    while (y >= 0 && x <= w - 1) {
        val = array[y][x];
        if (target == val) {
            return true;
        } else if (target < val) {
            y -= 1;
        } else {
            x += 1;
        }
    }
    
    return false;
}

另外的思路

簡單查找,複雜度O(n2n^2)

bool Find(int target, vector<vector<int> > array) {
    int h = array.size(), w = array[0].size();       
    for (int y = 0; y < h; ++y) {
        for (int x = 0; x < w; ++x) {
            if (array[y][x] == target) {
                return true;
            }                    
        }            
    }
    return false;
}

對每一行使用二分查找,算法複雜度O(nlognn*logn)

bool Find(int target, vector<vector<int> > array) {
    int h = array.size(), w = array[0].size();
    int low, high, mid, val;
    for (int y = 0; y < h; ++y) {
        low = 0;
        high = w - 1;
        while(low <= high) {
            mid = (low + high) / 2;
            val = array[y][mid];
            if (target == val) {
                return true;
            } else if (target < val) {
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }
    }
    return false;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章