From 205a1532da4a3e0973ce6149568d31c9e5d6d59a Mon Sep 17 00:00:00 2001 From: lichaoxi Date: Wed, 1 Jan 2020 10:30:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=205.=20=E6=9C=89=E5=BA=8F?= =?UTF-8?q?=E7=9F=A9=E9=98=B5=E7=9A=84=20Kth=20Element=20=E4=BA=8C?= =?UTF-8?q?=E5=88=86=E6=9F=A5=E6=89=BE=E6=B3=95=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原本实现,在计算 matrix[i][j] <= mid 的 count 时,耗时较高 --- notes/Leetcode 题解 - 数组与矩阵.md | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/notes/Leetcode 题解 - 数组与矩阵.md b/notes/Leetcode 题解 - 数组与矩阵.md index 288147f1..3560f3ee 100644 --- a/notes/Leetcode 题解 - 数组与矩阵.md +++ b/notes/Leetcode 题解 - 数组与矩阵.md @@ -146,20 +146,26 @@ return 13. ```java public int kthSmallest(int[][] matrix, int k) { - int m = matrix.length, n = matrix[0].length; - int lo = matrix[0][0], hi = matrix[m - 1][n - 1]; - while (lo <= hi) { - int mid = lo + (hi - lo) / 2; - int cnt = 0; - for (int i = 0; i < m; i++) { - for (int j = 0; j < n && matrix[i][j] <= mid; j++) { - cnt++; + int n = matrix.length; + int low = matrix[0][0], high = matrix[n-1][n-1]; + while (low < high) { + int mid = (low + high) >> 1; + int count = 0; + for (int i = 0, j = n - 1; i < n && j >= 0;) { + if (matrix[i][j] <= mid) { + count += j + 1; + i++; + } else { + j--; } } - if (cnt < k) lo = mid + 1; - else hi = mid - 1; + if (count < k) { + low = mid + 1; + } else { + high = mid; + } } - return lo; + return high; } ```