已知一个有序矩阵mat,同时给定矩阵的大小n和m以及需要查找的元素x,且矩阵的行和列都是从小到大有序的。设计查找算法返回所查找元素的二元数组,代表该元素的行号和列号(均从零开始)。保证元素互异。
数据范围:
,矩阵中的任何元素满足 
要求:空间复杂度
,时间复杂度
[[1,2,3],[4,5,6]],2,3,6
[1,2]
[[1,2,3]],1,3,2
[0,1]
//时间复杂度O(n+logm)
import java.util.*;
public class Solution {
public int[] findElement(int[][] mat, int n, int m, int x) {
for (int i = 0; i < n; i++) {
if (x >= mat[i][0] && x <= mat[i][m - 1]) {
int l = 0;
int r = m - 1;
while (l <= r) {
int mid = (l + r) / 2;
if (mat[i][mid] > x) r = mid - 1;
else if (mat[i][mid] < x) l = mid + 1;
else return new int[]{i, mid};
}
}
}
return new int[]{-1, -1};
}
} public int[] findElement(int[][] mat, int n, int m, int x) {
// write code here
for(int i=0;i<n;i++){
if(mat[i][0]<=x && mat[i][m-1]>=x){
int p1=0, p2=m-1;
while(p1<=p2){
int mid=(p1+p2)/2;
if(mat[i][mid]==x){
return new int[]{i,mid};
}else if(mat[i][mid]>x){
p2=mid-1;
}else{
p1=mid+1;
}
}
}
}
return null;
} /**
* NC86 矩阵元素查找
*/
public class NC86 {
public int[] findElement(int[][] mat, int n, int m, int x) {
// write code here
int[] ans = new int[2];
int i = n - 1;
int j = 0;
while (i >= 0 || j < m) {
if (mat[i][j] == x) {
ans[0] = i;
ans[1] = j;
return ans;
} else if (mat[i][j] < x) {
j++;
} else {
i--;
}
}
return ans;
}
public int[] findElement0(int[][] mat, int n, int m, int x) {
// write code here
int[] ans = new int[2];
for (int i = 0; i < n; i++) {
int l = 0;
int r = m - 1;
while (l <= r) {
int mi = l + ((r - l) >> 1);
if (mat[i][mi] == x) {
ans[0] = i;
ans[1] = mi;
return ans;
} else if (mat[i][mi] < x) {
l = mi + 1;
} else {
r = mi - 1;
}
}
}
return ans;
}
public int[] findElement1(int[][] mat, int n, int m, int x) {
// write code here
int[] ans = new int[2];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (mat[i][j] == x) {
ans[0] = i;
ans[1] = j;
return ans;
}
}
}
return ans;
}
} public int[] findElement(int[][] mat, int n, int m, int x) {
int col = m -1;
int row = 0;
while (col>=0 && row<=mat.length-1){
if (mat[row][col] == x){
return new int[]{row,col};
}else if (mat[row][col] > x){
col--;
}else {
row++;
}
}
return null;
} import java.util.*;
public class Solution {
public int[] findElement(int[][] mat, int n, int m, int x) {
// 有序数组
if (m == 0 || n == 0) return null;
int i = 0, j = 0;
// 先确定 列的位置
for ( ; j < m; ++ j) {
if (mat[0][j] <= x && x <= mat[n - 1][j]) break;
}
// 再确定 行的位置
for ( ; i < n; ++ i) {
if (mat[i][j] == x) break;
}
int[] res = {i ,j};
return res;
}
} public int[] findElement(int[][] mat, int n, int m, int x) {
// write code here
int[] res = new int[2];
int i = 0;
int j = m-1;
//从上往下,从右往左比较,x>mat[i][j]则下移一行,x<mat[i][j]则左移一列
while(i<n&&j>=0){
if(mat[i][j]>x) j--;
else if(mat[i][j]<x) i++;
else{
res[0]=i;
res[1]=j;
break;//一定要返回,否则会死循环
}
}
return res;
} * 思路: * 在矩阵中寻找元素,并返回该数的行和列。 * 设lin为行,row为列。 * 1、因为矩阵是有序的,所以我们首先可以拿该元素与每行最后一个元素比较 * 如果比最后一个元素大那肯定在下一行,lin++ * 2、在列中就相当于一元数组进行比较,得到该元素的列。
public int[] findElement(int[][] mat, int n, int m, int x) {
// write code here
int lin; //行
int row;//列
int[] array = new int[2]; //设置结果一维数组。最终将行与列存入该数组。
//遍历外层数组
for (lin = 0; lin < n; lin++) {
if(x > mat[lin][m-1]){
continue;
}else{
//遍历该行的内部数组与m做比较得到列
for (row = 0; row < m; row++) {
//比较大小
if(x == mat[lin][row]){
array[0] = lin;
array[1] = row;
break;
}
}
}
}
return array;
} import java.util.*;
public class Solution {
public int[] findElement(int[][] mat, int n, int m, int x) {
// write code here
int i = 0;
int j = m - 1;
while (i < n && j >= 0) {
if (mat[i][j] > x) {
j--;
} else if (mat[i][j] < x) {
i++;
} else {
break;
}
}
return new int[] {i, j};
}
}
import java.util.*;
public class Solution {
public int[] findElement(int[][] mat, int n, int m, int x) {
//为了个人的阅读方面,令m代表行,n代表列
int tmp=n;
n=m;m=tmp;
int [] res=new int[2];
//从右上角开始,如果x大于该数,则下移,若小于则右移
int i=0,j=n-1;
while(i<m&&j>=0)
{
if(x>mat[i][j])i++;
else if(x<mat[i][j])j--;
else{
res[0]=i;
res[1]=j;
break;
}
}
return res;
}
} //二维数组中的查找
public int[] findElement(int[][] mat, int n, int m, int x) {
//初态在右上角位置 左至右升序 上至下升序 那么这个位置只能左走使得当前数减少和下走使当前数增加
int row = 0, col = m-1;
while (col>=0&&row<n){
if (x>mat[row][col]) row++;//当前数小 要增加只能往下走
else if (x<mat[row][col]) col--; //当前数太大 要减少只能左走
else {//不大不小就是相等
return new int[]{row,col};
}
}
return new int[0];
}
//之所以一上来找行不行 是因为输入不是连续的 每一行跟下一行元素完全可以错开 不一定下面全比上面大
//每一行进行一下二分即可
public int[] findElement2(int[][] mat, int n, int m, int x) {
int rowNum = 0, colNum = 0;
for (int i = 0; i < n; i++) {
colNum = binarySearch(mat, m, i, x);
if (colNum != -1) {
rowNum = i;
return new int[]{rowNum, colNum};
}
}
return new int[0];
}
public int binarySearch(int[][] mat, int m, int rowNum, int x) {
int left = 0, right = m - 1, colNum = -1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (x == mat[rowNum][mid]) {
colNum = mid;
return colNum;
} else if (x > mat[rowNum][mid]) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
} import java.util.*;
public class Solution {
public int[] findElement(int[][] mat, int n, int m, int x) {
int[]goal=new int[2];
int i=n-1,j=0;
while(i>=0&&j<m){//从下往上,先确定行号,然后再遍历这一行确定列
if(mat[i][j]==x){
goal[0]=i;
goal[1]=j;
break;
}
else if(mat[i][j]>x) i--;
else j++;//
}
return goal;
}
} public int[] findElement(int[][] mat, int n, int m, int x) {
//和右上角的值比较
//定义行
//定义列
int i = 0;
int j = m - 1;
//int v = mat[i][j];
while(i < n && j >= 0){
if(x == mat[i][j]){
return new int[]{i,j};
//如果小于右上角的值j--;
}else if(x < mat[i][j]){
j--;
//如果大于右上角的值i++;
}else{
i++;
}
}
//找不到
return new int[]{-1,-1};
} import java.util.*;
public class Solution{
public int[] findElement(int[][] mat, int n, int m,int x){
//和左下角数字比较
//初始化行和列
int i = n - 1;
int j = 0;
while(i >= 0 && j < m){
//等于目标值
if(x == mat[i][j]){
return new int[]{i,j};
//大于目标值
}else if(x < mat[i][j]){
i--;
//小于目标值
}else{
j++;
}
}
//找不到
return new int[]{-1,-1};
}
}
import java.util.*;
public class Solution {
public int[] findElement(int[][] mat, int n, int m, int x) {
// write code here
if (n < 1 || m < 1) {
return new int[0];
}
int row_num = 0;
int column_num = m - 1;
int[] res = new int[2];
while (row_num >= 0 && row_num < n && column_num >= 0 && column_num < m){
if (mat[row_num][column_num] == x) {
res[0] = row_num;
res[1] = column_num;
return res;
}
if (mat[row_num][column_num] > x) {
column_num--;
continue;
}
if (mat[row_num][column_num] < x) {
row_num++;;
}
}
return new int[0];
}
} import java.util.*;
public class Solution {
public int[] findElement(int[][] mat, int n, int m, int x) {
int i=n-1;
int j=0;
int[] result=null;
while(i>=0&&j<=m-1){
if(x>mat[i][j]){
j++;
}else if(x<mat[i][j]){
i--;
}else{
result=new int[2];
result[0]=i;
result[1]=j;
return result;
}
}
return null;
}
}