給定M*N矩陣,每一行、每一列都按升序排列,找出某元素

/**java

 * 功能:給定M*N矩陣,每一行、每一列都按升序排列,找出某元素。app

 */this

 

兩種方法:spa

 

方法一:.net

[java] view plain copyblog

 

  1. /** 
  2.  * 思路:若列的末端大於x,那麼x位於該列的左邊;若行的開頭小於x,那麼x位於列的下邊。從矩陣中的子矩陣中查找元素。 
  3.  * @param matrix 
  4.  * @param elem 
  5.  * @return 
  6.  */  
  7. public static boolean findElement(int[][] matrix,int elem){  
  8.     int row=0;  
  9.     int col=matrix[0].length-1;  
  10.       
  11.     while(row<matrix.length&&col>=0){  
  12.         if(matrix[row][col]==elem)  
  13.             return true;  
  14.         else if(matrix[row][col]>elem)  
  15.             col--;  
  16.         else  
  17.             row++;  
  18.     }  
  19.     return false;  
  20. }  

 

方法二:遞歸

 

[java] view plain copyip

 

  1. /** 
  2.  * 思路:因爲每個元素都大於它左邊和上邊的元素,因此,若在矩陣裏任意畫長方形,其右下角的元素必定是最大的,左上角的元素必定是最小的。 
  3.  * 將矩陣分爲四個區域,以遞歸方式搜索左下區域和右上區域。 
  4.  * @param matrix 
  5.  * @param elem 
  6.  */  
  7. public void findElement2(int[][] matrix,int elem){  
  8.     Coordinate origin=new Coordinate(0,0);  
  9.     Coordinate dest=new Coordinate(matrix.length-1,matrix[0].length-1);  
  10.     find(matrix, origin, dest, elem);  
  11. }  
  12.   
  13. public Coordinate find(int[][] matrix,Coordinate origin,Coordinate dest,int x){  
  14.     if(!origin.inBounds(matrix)||!dest.inBounds(matrix))  
  15.         return null;  
  16.       
  17.     if(matrix[origin.row][origin.column]==x)  
  18.         return origin;  
  19.     else if(!origin.isBefore(dest))  
  20.         return null;  
  21.       
  22.     //start和end 分別設爲對角線的起點和終點,矩陣不必定是正方形,所以對角線的終點也不必定是dest。  
  23.     Coordinate start=(Coordinate) origin.clone();  
  24.     int distance=Math.min(dest.row-origin.row, dest.column-origin.column);  
  25.       
  26.     Coordinate end=new Coordinate(start.row+distance, start.column+distance);  
  27.       
  28.     Coordinate p=new Coordinate(0,0);  
  29.       
  30.     //在對角線上進行二分查找  
  31.     while(start.isBefore(end)){  
  32.         p.setToAverage(start, end);  
  33.         if(x>matrix[p.row][p.column]){  
  34.             start.row=p.row+1;  
  35.             start.column=p.column+1;  
  36.         }else{  
  37.             end.row=p.row-1;  
  38.             end.column=p.column-1;  
  39.         }  
  40.     }  
  41.     //將矩陣分爲四個區域,搜索左下區域和右上區域  
  42.     return partitionAandSearch(matrix,origin,dest,start,x);  
  43.       
  44. }  
  45.   
  46. public Coordinate partitionAandSearch(int[][] matrix,Coordinate origin,Coordinate dest,Coordinate pivot,int elem){  
  47.     Coordinate lowerLeftOrigin=new Coordinate(pivot.row, origin.column);  
  48.     Coordinate lowerLeftDest=new Coordinate(dest.row,pivot.column-1);  
  49.       
  50.     Coordinate upperRightOrigin=new Coordinate(origin.row,pivot.column);  
  51.     Coordinate upperRightDest=new Coordinate(pivot.row-1,dest.column);  
  52.       
  53.     Coordinate lowerLeft=find(matrix, lowerLeftOrigin, lowerLeftDest, elem);  
  54.     if(lowerLeft==null)  
  55.         return find(matrix, upperRightOrigin, upperRightDest, elem);  
  56.     return lowerLeft;  
  57. }  
  58.   
  59.   
  60.   
  61. lass Coordinate implements Cloneable{  
  62. public int row;  
  63. public int column;  
  64. public Coordinate(int r,int c){  
  65.     this.row=c;  
  66.     this.column=c;  
  67. }  
  68.   
  69. public boolean inBounds(int[][] matrix){  
  70.     return row>=0&&row<matrix.length&&column>=0&&column<matrix[0].length;  
  71. }  
  72.   
  73. public boolean isBefore(Coordinate p){  
  74.     return this.row<=p.row&&this.column<=p.column;  
  75. }  
  76.   
  77. public Object clone(){  
  78.     return new Coordinate(row,column);  
  79. }  
  80.   
  81. public void setToAverage(Coordinate min,Coordinate max){  
  82.     row=(min.row+max.row)/2;  
  83.     column=(min.column+max.column)/2;  
  84. }

或者get

package com.huanchuang.arvin.vo;

public class Finder {
    private String findElement(int[][] matrix, int target) {
        int row = 0, column = 0;
        // 只要行尚未達到最大值就繼續執行
        while (row < matrix.length) {
            int colMax = matrix[row].length - 1;// 用於獲取矩陣每一行的最大值
            // 由於是行和列都是贈序的,只要指定的數在每一行的最小值和最大值之間,就返回true
            if (matrix[row][column] <= target && matrix[row][colMax] >= target) {
                for (int i = 0; i < matrix[row].length; i++) {
                    if (matrix[row][i] == target) {
                        return "matrix[" + row + "][" + i + "]";
                    }
                }
            } else {// 不然的話就自動去下一行進行比較
                row++;
            }
        }
        return "matrix[-1][-1]";// 返回-1表示不存在
    }

    public static void main(String[] args) {
        int matrix[][] = { { 1, 2, 3 }, { 4, 5 }, { 7, 8, 9 } };
        Finder finder = new Finder();
        String location = finder.findElement(matrix, 6);
        System.out.println("位置" + location);
    }

}flash

 

或者:

方法一:從矩陣的右上角開始找

 

[cpp] view plain copy

 

  1. bool HasElement(vector<vector<int>> martix,int elem)  
  2. {  
  3.     if(martix.empty() || martix[0].empty())  
  4.         return false;  
  5.     int row=0,col=martix[0].size()-1;//右上角元素  
  6.     while(row<martix.size() && col>=0)  
  7.     {  
  8.         if(martix[row][col]==elem)  
  9.             return true;  
  10.         else if(martix[row][col]>elem)  
  11.             col--;  
  12.         else  
  13.             row++;  
  14.     }  
  15.     return false;  
  16. }  


 

 

    方法二:從矩陣的左下角開始找

 

[cpp] view plain copy

 

  1. bool HasElement(vector<vector<int>> martix,int elem)  
  2. {  
  3.     if(martix.empty() || martix[0].empty())  
  4.         return false;  
  5.     int row=martix.size()-1,col=0;//左下角元素  
  6.     while(row>=0 && col<martix[0].size())  
  7.     {  
  8.         if(martix[row][col]==elem)  
  9.             return true;  
  10.         else if(martix[row][col]<elem)  
  11.             col++;  
  12.         else  
  13.             row--;  
  14.     }  
  15.     return false;  
  16. }
相關文章
相關標籤/搜索