1. 題目描述
2. 題目分析
- 這個題目類似於【劍指offer】-二維數組的查找-01/67
- 在此題的基礎上進行一些擴展,題目要求我們找到矩陣中第K小的元素,也就是在1~15的範圍中,找到第K小的數字。
- 我們對1~15進行二分,用mid來判斷當前矩陣中小於等於mid的的有多少(count),如果count小於K的話,也就是在證明當前的元素過於小,所以,需要left = mid + 1;如果count大於等於K的話,也就是證明當前的元素過於大或者正好,所以,需要right = mid。
- 這裏比較困惑的一點是,怎麼證明最後返回的left一定在數組內,咱們可以這樣想,首先對於第K小的元素,比如13,我們用二分找到的count只要是大於等於K的,肯定是大於等於13的,然後我們縮小mid的值,直到最後left == right,也就是最左邊的邊界(13),也可以理解成,在矩陣中,只有13,14是等於K的,我們需要找他最左邊的值。
3. 題目代碼
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) / 2;
int i = n - 1;
int j = 0;
int num = 0;
while (i >= 0 && j < n) {
if (matrix[i][j] <= mid) {
num += i + 1;
j++;
} else {
i--;
}
}
if (num >= k) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}