7272
7373- 最后直接返回 start, end, 或者 mid 都可以,因此三者最终会收敛到矩阵中的一个元素,这个元素也正是我们要找的元素。
7474
75+ 关于如何计算 count,我们可以从左下或者右上角开始,每次移动一个单位,直到找到一个值大于等于中间值,然后计算出 count,具体见下方代码。
76+
7577整个计算过程是这样的:
7678
7779![ 378.kth-smallest-element-in-a-sorted-matrix-4] ( https://tva1.sinaimg.cn/large/007S8ZIlly1ghltyfm2okj30je0fq0uf.jpg )
@@ -92,6 +94,10 @@ k = 8,
9294
9395## 代码
9496
97+ 代码支持:JS,Python3,CPP
98+
99+ JS:
100+
95101``` js
96102/*
97103 * @lc app=leetcode id=378 lang=javascript
@@ -146,6 +152,77 @@ var kthSmallest = function (matrix, k) {
146152};
147153```
148154
155+ Python3:
156+
157+ ``` python
158+ class Solution :
159+ def kthSmallest (self , matrix : List[List[int ]], k : int ) -> int :
160+ n = len (matrix)
161+
162+ def check (mid ):
163+ row, col = n - 1 , 0
164+ num = 0
165+ while row >= 0 and col < n:
166+ # 增加 col
167+ if matrix[row][col] <= mid:
168+ num += row + 1
169+ col += 1
170+ # 减少 row
171+ else :
172+ row -= 1
173+ return num >= k
174+
175+ left, right = matrix[0 ][0 ], matrix[- 1 ][- 1 ]
176+ while left <= right:
177+ mid = (left + right) // 2
178+ if check(mid):
179+ right = mid - 1
180+ else :
181+ left = mid + 1
182+
183+ return left
184+
185+ ```
186+
187+ CPP Code:
188+
189+ ``` cpp
190+ class Solution {
191+ public:
192+ bool check(vector<vector<int >>& matrix, int mid, int k, int n) {
193+ int row = n - 1;
194+ int col = 0;
195+ int num = 0;
196+ while (row >= 0 && col < n) {
197+ if (matrix[ row] [ col ] <= mid) {
198+ num += i + 1;
199+ col++;
200+ } else {
201+ row--;
202+ }
203+ }
204+ return num >= k;
205+ }
206+
207+ int kthSmallest(vector<vector<int>>& matrix, int k) {
208+ int n = matrix.size();
209+ int left = matrix[0][0];
210+ int right = matrix[n - 1][n - 1];
211+ while (left <= right) {
212+ int mid = left + ((right - left) >> 1);
213+ if (check(matrix, mid, k, n)) {
214+ right = mid - 1;
215+ } else {
216+ left = mid + 1;
217+ }
218+ }
219+ return left;
220+ }
221+ };
222+
223+
224+ ```
225+
149226** 复杂度分析**
150227
151228- 时间复杂度:二分查找进行次数为 $O(log(r-l))$,每次操作时间复杂度为 O(n),因此总的时间复杂度为 $O(nlog(r-l))$。
0 commit comments