题解 | #二维数组中的查找#

二维数组中的查找

http://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e

为了满足时间复杂度低于O(n+m),观察数据结构,发现该数据结构所构成的矩阵,从左下角的点起,右侧的点大于该点,上方的点小于该点,可以通过逐次移动该点来查找目标点。
这种做法的时间复杂度最大为O(n+m)。具体实现如下,通过引入两个变量来进行越界检测,引入另外两个变量进行游标控制。

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        if(array.size() == 0 || array.at(0).size() == 0){
            return false;
        }
        int rowCount = 1;
        int colCount = 1;
        int rowCursor = array.size() - 1;
        int colCursor = 0;
        while(true){
            if(array.at(rowCursor).at(colCursor) == target){
                return true;
            }
            if(array.at(rowCursor).at(colCursor) > target){
                rowCount++;
                rowCursor--;
                if(rowCount > array.size()){
                    return false;
                }
            }
            if(array.at(rowCursor).at(colCursor) < target){
                colCount++;
                colCursor++;
                if(colCount > array.at(0).size()){
                    return false;
                }
            }
        }
    }
};


时隔一个月再次刷到这道题,这次思路非常清晰,写下的代码也更加简洁。相较于上面的代码,结构上有不少优化。

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        if(array.empty()){
            return false;
        }
        int row = array.size() - 1;
        int col = 0;
        while(col < array.at(0).size() && row >= 0){
            if(target == array.at(row).at(col)){
                return true;
            }
            else if(target > array.at(row).at(col)){
                col++;
            }
            else{
                row--;
            }
        }
        return false;
    }
};
全部评论

相关推荐

投递拓竹科技等公司10个岗位
点赞 评论 收藏
分享
有没有佬投这个呀,怎么样呀求问
投递中科院空天信息创新研究院等公司10个岗位
点赞 评论 收藏
分享
陆续:不可思议 竟然没那就话 那就我来吧 :你是我在牛客见到的最美的女孩
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务