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

二维数组中的查找

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

初始解法:采用双层for循环,直接遍历数组,时间复杂度是O(row * col)

 bool Find(int target, vector< vector<int> > array) {
        if(array.size() == 0) return false;
        if(array[0].size() == 0) return false;

        int row = 0, col = n-1;
        for(int row = 0 ; row < array.size(); ++row )
            for(int col = 0 ; col< array[0].size(); ++col)
            {
                if(target == array[row][col]) 
                {
                    return true;
                }
           }
        return false;
    }

解法①:利用二维数组由上到下,由左到右递增的规律,那么选取右上角或者左下角的元素a[row][col]与target进行比较,
当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,即col--;
当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,即row++;
时间复杂度是O(row + col),当图片说明 时,O(row + col) ~ O(n)

 bool Find(int target, vector< vector<int> > array) {
        int m = array.size();
        if(m == 0) return false;
        int n = array[0].size();
        if(n == 0) return false;

        int row = 0, col = n-1;
        while(row < m && col >= 0)
        {
            if(target == array[row][col]) 
            {
                return true;
            }
            else if(target > array[row][col])
            {
                 ++row;
            }
            else 
                 --col;
        }
        return false;
    }

解法②:把每一行看成有序递增的数组,利用二分查找,通过遍历每一行得到答案,时间复杂度是O(nlogn)

     bool Find(int target, vector< vector<int> > array) {
         for(int i = 0 ; i < array.size() ; i++){
             int low = 0;
             int high = array[i].size()-1;
             while(low <= high){
                 int mid = (low + high) / 2;
                 if(target > array[i][mid])
                     low = mid + 1;
                 else if(target < array[i][mid])
                     high = mid - 1;
                 else
                     return true;
             }
         }
         return false;
     }
全部评论

相关推荐

付费才包邮:本科有这种简历很强了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务