二维数组中的查找

题目描述

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

算法实现

从矩阵左下角元素开始,比它小的在它上面,比它大的数在它右边。矩阵中所有元素都满足这个性质,利用这个特性进行查找。算法复杂度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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章