import java.util.*; /** * NC86 矩阵元素查找 * @author d3y1 */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param mat int整型二维数组 * @param n int整型 * @param m int整型 * @param x int整型 * @return int整型一维数组 */ public int[] findElement (int[][] mat, int n, int m, int x) { // return solution1(mat, n, m, x); return solution2(mat, n, m, x); } /** * 二分: 每行 * @param mat * @param n * @param m * @param x * @return */ private int[] solution1(int[][] mat, int n, int m, int x){ int left; int right; int mid; // 每行 for(int row=0; row<n; row++){ if(x<mat[row][0] || mat[row][m-1]<x){ continue; } // 二分 left = 0; right = m-1; while(left <= right){ mid = (left+right)/2; if(mat[row][mid] < x){ left = mid + 1; }else if(mat[row][mid] > x){ right = mid -1; }else{ return new int[]{row, mid}; } } } return new int[2]; } /** * 二分: 每步向上或向右(从左下至右上) * @param mat * @param n * @param m * @param x * @return */ private int[] solution2(int[][] mat, int n, int m, int x){ // 每步向上或向右(从左下至右上) for(int row=n-1,col=0; row>=0&&col<m;){ // 向右 if(mat[row][col] < x){ col++; } // 向上 else if(mat[row][col] > x){ row--; } // 相等 else{ return new int[]{row,col}; } } return new int[2]; } }