1. 程式人生 > >LintCode 401-排序矩陣中的從小到大第k個數

LintCode 401-排序矩陣中的從小到大第k個數

本人電子系,只為一學生。心喜計算機,小編以怡情。

在一個排序矩陣中找從小到大的第 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; } }