本人电子系,只为一学生。心喜计算机,小编以怡情。
在一个排序矩阵中找从小到大的第 k 个整数。
排序矩阵的定义为:每一行递增,每一列也递增。
您在真实的面试中是否遇到过这个题? Yes
样例
给出 k = 4 和一个排序矩阵:
[
[1 ,5 ,7],
[3 ,7 ,8],
[4 ,8 ,9],
]
返回 5。
思路是广度优先搜索
//自定义的数据结构
static public class Data{
public int x,y,data;
public Data(int x,int y,int data){
this.x=x;
this.y=y;
this.data=data;
}
}
static public int kthSmallest(int[][] matrix, int k) {
// write your code here
if(matrix.length==0) return 0;
int visited[][]=new int[matrix.length][matrix[0].length];
ArrayList<Data> temp=new ArrayList<>();
int count=0;
temp.add(new Data(0,0,matrix[0][0]));
while(!temp.isEmpty()){//广度优先搜索
Data linshi=temp.remove(0);
count++;
if(count==k)//找到数据时直接返回
return linshi.data;
if(linshi.x+1<matrix.length&&visited[linshi.x+1][linshi.y]==0){
temp.add(new Data(linshi.x+1,linshi.y,matrix[linshi.x+1][linshi.y]));
visited[linshi.x+1][linshi.y]=1;
}
if(linshi.y+1<matrix[0].length&&visited[linshi.x][linshi.y+1]==0) {
visited[linshi.x][linshi.y+1]=1;
temp.add(new Data(linshi.x, linshi.y + 1, matrix[linshi.x][linshi.y + 1]));
}
Collections.sort(temp,new MyIntComparator());//排序
}
return 0;
}
//自定义的比较器
static class MyIntComparator implements Comparator{
public int compare(Object o1, Object o2) {
Data a = (Data)o1;
Data b = (Data)o2;
int i1=a.data;
int i2=b.data;
if (i1 < i2){
return -1;
}
if (i1 > i2){
return 1;
}
return 0;
}
}