• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
ArgenBarbie
博客园    首页    新随笔    联系   管理    订阅  订阅
74. Search a 2D Matrix

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:

 

  • Integers in each row are sorted from left to right.
  • The first integer of each row is greater than the last integer of the previous row.

 

For example,

Consider the following matrix:

[
  [1,   3,  5,  7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
]

Given target = 3, return true.

 

1. 

转换成一位数组下标,二分查找。

bool searchMatrix01(vector<vector<int>>& matrix, int target) {
    int row = matrix.size();
    int col = row>0 ? matrix[0].size() : 0;
        
    int len = row * col;
    int low = 0, high = len -1;
    while (low <= high) {
            
        int mid = low + (high - low) / 2;
        int r = mid / col;
        int c = mid % col;
 
        int n = matrix[r][c];
        if (n == target) return true;
        if (n < target) low = mid+1;
        else high = mid -1;
    }
    return false;
}

 

2.

行和列分别二分查找。

bool searchMatrix02(vector<vector<int> > &matrix, int target) {
        
    int idx = vertical_binary_search(matrix, target);
    if (idx<0){
        return false;
    }
        
    idx = binary_search(matrix[idx], target);
        
    return (idx < 0 ? false : true);
        
}

int vertical_binary_search(vector< vector<int> > v, int key){
    int low = 0;
    int high = v.size()-1;
    while(low <= high){
        int mid = low + (high-low)/2;
        if (v[mid][0] == key){
            return mid;
        }
        if (key < v[mid][0]){
            high = mid - 1;
            continue;
        }
        if (key > v[mid][0]){
            low = mid + 1;
            continue;
        }
    }
    return low-1;        
}
    
int binary_search(vector<int> v, int key) {
    int low = 0;
    int high = v.size()-1;
    while(low <= high){
        int mid = low + (high-low)/2;
        if (v[mid] == key){
            return mid;
        }
        if (key < v[mid]){
            high = mid - 1;
            continue;
        }
        if (key > v[mid]){
            low = mid + 1;
            continue;
        }
    }
    return -1;
}

 

posted on 2016-03-16 17:16  ArgenBarbie  阅读(185)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3