zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    LeetCode题解之Flipping an Image
    LeetCode 之Find Minimum in Rotated Sorted Array
    LeetCode题解Transpose Matrix
    LeetCode 题解之Minimum Index Sum of Two Lists
    LeetCode题解之Intersection of Two Linked Lists
    LeetCode 题解之Add Two Numbers II
    LeetCode题解之Add two numbers
    href="#"与href="javascript:void(0)"的区别
    有关ie9 以下不支持placeholder属性以及获得焦点placeholder的移除
    ie7下属性书写不规范造成的easyui 弹窗布局紊乱
  • 原文地址:https://www.cnblogs.com/ZhongliangXiang/p/7397563.html
Copyright © 2011-2022 走看看