• 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.

    自己代码,自己想法,查看了别人的,被一顿教育,请看:
    关于二分法的写法,被网上各帖子一顿教育,教育的 contents 在下面代码的注释中.

    另一方面要注意的是:

    • 用1次 BinarySearch,treat matrix as a Array
    • a[x] => matrix[x / 列][x % 列]
    bool searchMatrix(vector<vector<int>>& A, int ta) {
    	// 用1次 BinarySearch,treat matrix as a Array
    	// n * m matrix convert to an array => matrix[x][y] => a[x * m + y]
    	// an array convert to n * m matrix => a[x] =>matrix[x / m][x % m];
    
    	if (A.empty() || A[0].empty())
    		return false;
    
    	int m = A.size(), n = A[0].size();
    	int lo = 0, hi = m * n - 1, mid, ro, co;
    
    	while (lo <= hi) { // 是<=
    		mid = lo + (hi - lo) / 2; //据说防溢出
    		ro = mid / n;
    		co = mid % n;
    		if (A[ro][co] == ta) return true; //紧凑的判断
    		else if (A[ro][co] > ta) hi = mid - 1;
    		else lo = mid + 1;
    	}
    	return false; // 退出循环就说明没找到!
    }
    

    最初自己想法,自己代码,超时,未通过(不仅是2次二分,更糟糕的是,我头脑中一直认为并使用的二分法写法,是错的,太可怕了)!
    用两次二分.
    (O(logn)) time, (O(1)) space.

    bool searchMatrix(vector<vector<int>>& A, int ta) {
    	// 注意:我的这个代码是错的:二分写错,两次二分也不妥,但不错.
    
    	// 用两次 BinarySearch
    	// 第 1 次,应用于第 0 列,目的是找出元素在哪行,假如在 i 行
    	// 第 2 次,应用于第 i 行,目的是找出该行是否存在要找的元素 ta
    
    	int m = A.size(), n = A[0].size();
    	int lo = 0, hi = m - 1, loo = 0, hii = n - 1, mid;
    
    	// step1. 应用于第 0 列,目的是找出元素在哪行
    	while (lo < hi) {
    		mid = (lo + hi) / 2;
    		if (A[mid][0] < ta)
    			lo = mid + 1;
    		if (A[mid][0] > ta)
    			hi = mid - 1;
    	} // 若退出循环,lo==hi,认为元素在第 lo 行
    
    	if (A[lo][0] == ta)
    		return true;
    
    	// step2. 针对第 lo 行,用二分法,找出是否存在要找的元素 ta
    	while (loo < hii) {
    		mid = (loo + hii) / 2;
    		if (A[lo][mid] < ta)
    			loo = mid + 1;
    		if (A[lo][mid] > ta)
    			hii = mid - 1;
    	} // 若退出循环,loo==hii,查看 A[lo][loo] 是否为 target
    
    	if (A[lo][loo] == ta)
    		return true;
    	else
    		return false;
    }
    
  • 相关阅读:
    Prometheus+Grafana监控
    交互式查询⼯具Impala
    langsong
    linux awk命令详解
    k8s环境下处理容器时间问题的多种姿势
    Golang数据类型之结构体-下篇
    Syntax Error: TypeError: this.getOptions is not a function报错
    百度地图开发-绘制点线提示框 07
    百度地图开发-与地图的交互功能 06
    百度地图开发-实现离线地图功能 05
  • 原文地址:https://www.cnblogs.com/ZhongliangXiang/p/7397563.html
Copyright © 2020-2023  润新知