LintCode 401-排序矩陣中的從小到大第k個數
阿新 • • 發佈:2019-02-01
本人電子系,只為一學生。心喜計算機,小編以怡情。
在一個排序矩陣中找從小到大的第 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;
}
}