/**java
* 功能:給定M*N矩陣,每一行、每一列都按升序排列,找出某元素。app
*/this
兩種方法:spa
方法一:.net
[java] view plain copyblog
- /**
- * 思路:若列的末端大於x,那麼x位於該列的左邊;若行的開頭小於x,那麼x位於列的下邊。從矩陣中的子矩陣中查找元素。
- * @param matrix
- * @param elem
- * @return
- */
- public static boolean findElement(int[][] matrix,int elem){
- int row=0;
- int col=matrix[0].length-1;
-
- while(row<matrix.length&&col>=0){
- if(matrix[row][col]==elem)
- return true;
- else if(matrix[row][col]>elem)
- col--;
- else
- row++;
- }
- return false;
- }
方法二:遞歸
[java] view plain copyip
- /**
- * 思路:因爲每個元素都大於它左邊和上邊的元素,因此,若在矩陣裏任意畫長方形,其右下角的元素必定是最大的,左上角的元素必定是最小的。
- * 將矩陣分爲四個區域,以遞歸方式搜索左下區域和右上區域。
- * @param matrix
- * @param elem
- */
- public void findElement2(int[][] matrix,int elem){
- Coordinate origin=new Coordinate(0,0);
- Coordinate dest=new Coordinate(matrix.length-1,matrix[0].length-1);
- find(matrix, origin, dest, elem);
- }
-
- public Coordinate find(int[][] matrix,Coordinate origin,Coordinate dest,int x){
- if(!origin.inBounds(matrix)||!dest.inBounds(matrix))
- return null;
-
- if(matrix[origin.row][origin.column]==x)
- return origin;
- else if(!origin.isBefore(dest))
- return null;
-
- //start和end 分別設爲對角線的起點和終點,矩陣不必定是正方形,所以對角線的終點也不必定是dest。
- Coordinate start=(Coordinate) origin.clone();
- int distance=Math.min(dest.row-origin.row, dest.column-origin.column);
-
- Coordinate end=new Coordinate(start.row+distance, start.column+distance);
-
- Coordinate p=new Coordinate(0,0);
-
- //在對角線上進行二分查找
- while(start.isBefore(end)){
- p.setToAverage(start, end);
- if(x>matrix[p.row][p.column]){
- start.row=p.row+1;
- start.column=p.column+1;
- }else{
- end.row=p.row-1;
- end.column=p.column-1;
- }
- }
- //將矩陣分爲四個區域,搜索左下區域和右上區域
- return partitionAandSearch(matrix,origin,dest,start,x);
-
- }
-
- public Coordinate partitionAandSearch(int[][] matrix,Coordinate origin,Coordinate dest,Coordinate pivot,int elem){
- Coordinate lowerLeftOrigin=new Coordinate(pivot.row, origin.column);
- Coordinate lowerLeftDest=new Coordinate(dest.row,pivot.column-1);
-
- Coordinate upperRightOrigin=new Coordinate(origin.row,pivot.column);
- Coordinate upperRightDest=new Coordinate(pivot.row-1,dest.column);
-
- Coordinate lowerLeft=find(matrix, lowerLeftOrigin, lowerLeftDest, elem);
- if(lowerLeft==null)
- return find(matrix, upperRightOrigin, upperRightDest, elem);
- return lowerLeft;
- }
-
-
-
- lass Coordinate implements Cloneable{
- public int row;
- public int column;
- public Coordinate(int r,int c){
- this.row=c;
- this.column=c;
- }
-
- public boolean inBounds(int[][] matrix){
- return row>=0&&row<matrix.length&&column>=0&&column<matrix[0].length;
- }
-
- public boolean isBefore(Coordinate p){
- return this.row<=p.row&&this.column<=p.column;
- }
-
- public Object clone(){
- return new Coordinate(row,column);
- }
-
- public void setToAverage(Coordinate min,Coordinate max){
- row=(min.row+max.row)/2;
- column=(min.column+max.column)/2;
- }
或者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
- bool HasElement(vector<vector<int>> martix,int elem)
- {
- if(martix.empty() || martix[0].empty())
- return false;
- int row=0,col=martix[0].size()-1;//右上角元素
- while(row<martix.size() && col>=0)
- {
- if(martix[row][col]==elem)
- return true;
- else if(martix[row][col]>elem)
- col--;
- else
- row++;
- }
- return false;
- }
方法二:從矩陣的左下角開始找
[cpp] view plain copy
- bool HasElement(vector<vector<int>> martix,int elem)
- {
- if(martix.empty() || martix[0].empty())
- return false;
- int row=martix.size()-1,col=0;//左下角元素
- while(row>=0 && col<martix[0].size())
- {
- if(martix[row][col]==elem)
- return true;
- else if(martix[row][col]<elem)
- col++;
- else
- row--;
- }
- return false;
- }