classSolution{ publicintkthSmallest(int[][] matrix, int k){ //优先级队列 PriorityQueue<int[]> pq = new PriorityQueue<int[]>(new Comparator<int[]>() { publicintcompare(int[] a, int[] b){ return a[0] - b[0]; } }); int n = matrix.length; //将第一列的元素加入优先级队列 for (int i = 0; i < n; i++) { pq.offer(newint[]{matrix[i][0], i, 0}); } //依次取出最小的 k - 1 个数 for (int i = 0; i < k - 1; i++) { int[] now = pq.poll(); if (now[2] != n - 1) { pq.offer(newint[]{matrix[now[1]][now[2] + 1], now[1], now[2] + 1}); } } return pq.poll()[0]; } }
classSolution{ publicintkthSmallest(int[][] matrix, int k){ int n = matrix.length; int left = matrix[0][0]; int right = matrix[n - 1][n - 1]; while(left < right){ int mid = left + (right - left) / 2; if(check(matrix, mid, k, n)){ //不大于 mid 的数大于 k 个,x <= mid right = mid; }else{ //不大于 mid 的数小于 k 个,x > mid left = mid + 1; } } return left; }
publicbooleancheck(int[][] matrix, int mid, int k, int n){ int i = n - 1; int j = 0; int num = 0; while(i >= 0 && j < n){ if(matrix[i][j] <= mid){ //将第 j 列中小于 mid 的数的个数加到总数 num += i + 1; //右移 j++; }else{ //上移 i--; } } //不大于 mid 的数是否大于等于 k return num >= k; } }