题目描述: 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素 示例: matrix = [ [ 1, 5, 9], [10, 11, 13], [12, 13, 15] ], k = 8,
返回 13。
具体代码实现如下:
/* 利用二分法的思想对有序矩阵进行排序,寻找第K小的元素,根据题意得:矩阵左往右、从上往下递增。故取一个中间数mid=left+(right-left)/2, 从矩阵左下角matrix[i][0]开始和mid进行比较,若小于等于mid,则往右移动,若大于mid则往上移动,并计算元素个数num。循环终止条件为:走出矩阵范围。 若num小于k,则证明第K小的元素在右半边,故令left=mid+1,right=right,继续循环。 若num大于k,则证明第K小的元素在左半边(包含mid),故令left=left,right=mid,继续循环。最终返回条件为left。 */ class Solution { public int kthSmallest(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;// 取数组中间的元素值 int count = help(matrix, mid, n);// 获得左上角中小于等于元素得个数 if(count < k){ left = mid + 1; }else{ right = mid; } } return left; } public int help(int[][] matrix, int mid, int n){// 参数传入数组、中间元素和数组的行长度 int i = n - 1;// 表示行 int j = 0;// 表示列 int count = 0;// 用于计数 while(i >= 0 && j < n){ if(matrix[i][j] <= mid){ j++; count += i+1;// j这一列的元素都小,所以将元素个数统一加进去 }else{ i--; } } return count;// 记录左上角中小于等于mid的元素个数 } }人生若只如初见,何事秋风悲画扇。 等闲变却故人心,却道故人心易变。 -----------纳兰性德
小白寄语:学如逆水行舟,不进则退。