zoukankan      html  css  js  c++  java
  • Search a 2D Matrix,在有序矩阵查找,二分查找的变形; 行有序,列有序查找。

    问题描述:矩阵每一行有序,每一行的最后一个元素小于下一行的第一个元素,查找。

    算法分析:这样的矩阵其实就是一个有序序列,可以使用折半查找算法。

    public class SearchInSortedMatrix 
    {
    	public static boolean searchMatrix(int[][] matrix, int target)
    	{
    		int m = matrix.length;
    		int n = matrix[0].length;
    		int low = 0;
    		int high = m*n - 1;
    		while(low <= high)
    		{
    			int mid = (low + high)/2;
    			int row = mid / n;
    			int column = mid % n;
    			if(matrix[row][column] == target)
    			{
    				return true;
    			}
    			else if(matrix[row][column] < target)
    			{
    				low = mid + 1;
    			}
    			else
    			{
    				high = mid - 1;
    			}
    		}
    		return false;
    	}
    }
    

    问题描述:二维矩阵行有序,列有序,进行查找。

    算法分析:有两种方法,一种是将矩阵按中心点分成左上,左下,右上,右下,四部分,进行递归查找。

         还有一种比较巧妙的查找方法,就是从左下角或者右上角的元素进行查找。

    	//矩阵每一行有序,每一列有序
    	public  boolean searchMatrix2(int[][] matrix, int target)
    	{
    		int m = matrix.length;
    		int n = matrix[0].length;
    		return helper(matrix, 0, m-1, 0, n-1, target);
    	}
    	public boolean helper(int[][] matrix, int rowStart, int rowEnd, int colStart, int colEnd, int target)
    	{
    		int rm = (rowStart + rowEnd)/2;
    		int cm = (colStart + colEnd)/2;
    		if(rowStart > rowEnd || colStart > colEnd)
    		{
    			return false;
    		}
    		if(matrix[rm][cm] == target)
    		{
    			return true;
    		}
    		else if(matrix[rm][cm] > target)
    		{
    			return helper(matrix, rowStart, rm - 1, colStart, cm - 1, target)
    				|| helper(matrix, rm, rowEnd, colStart, cm - 1, target)
    				|| helper(matrix, rowStart, rm - 1, cm, colEnd, target);
    		}
    		else
    		{
    			return helper(matrix, rm + 1, rowEnd, cm + 1, colEnd, target)
    				|| helper(matrix, rm + 1, rowEnd, colStart, cm, target)
    				|| helper(matrix, rowStart, rm, cm + 1, colEnd, target);
    				   
    		}
    	}
    	
    	//从右上角元素进行查找
    	public boolean searchMatrix3(int[][] matrix, int target)
    	{
    		int m = matrix.length;
    		int n = matrix[0].length;
    		int low = 0;
    		int high = m*n - 1;
    		while(low <= high)
    		{
    			int mid = (low + high)/2;
    			int row = mid / n;
    			int column = mid % n;
    			if(matrix[row][column] == target)
    			{
    				return true;
    			}
    			else if(matrix[row][column] < target)
    			{
    				low = mid + 1;
    			}
    			else
    			{
    				high = mid - 1;
    			}
    		}
    		return false;
    	}
    
  • 相关阅读:
    CopyOnWriteArrayList
    Gradle version 2.2 is required. Current version is 2.10
    install mysql on ubuntu
    A<T extends B> and A <? extends B>
    java event listeners and dispatcher
    git
    linux patch usage
    Codeforces Round #404 (Div. 2) C 二分查找
    dijkstra算法模板及其用法
    Sublime Text 3 快捷键精华版
  • 原文地址:https://www.cnblogs.com/masterlibin/p/5785357.html
Copyright © 2011-2022 走看看