• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
neverlandly
博客园    首页    新随笔    联系   管理    订阅  订阅

Leetcode: Kth Smallest Element in a Sorted Matrix

Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth smallest element in the matrix.

Note that it is the kth smallest element in the sorted order, not the kth distinct element.

Example:

matrix = [
   [ 1,  5,  9],
   [10, 11, 13],
   [12, 13, 15]
],
k = 8,

return 13.
Note: 
You may assume k is always valid, 1 ≤ k ≤ n2.

Heap: you need to know the row number and column number of that element(so we can create a tuple class here)

 1 public class Solution {
 2     public int kthSmallest(int[][] matrix, int k) {
 3         Comparator<Tuple> comp = new Comparator<Tuple>() {
 4             public int compare(Tuple tp1, Tuple tp2) {
 5                 return tp1.val - tp2.val;
 6             }
 7         };
 8         
 9         PriorityQueue<Tuple> minHeap = new PriorityQueue<Tuple>(matrix.length, comp);
10         
11         int res = 0;
12         
13         for (int row=0; row<matrix.length; row++) {
14             minHeap.offer(new Tuple(row, 0, matrix[row][0]));
15         }
16         
17         
18         for (int i=1; i<=k; i++) {
19             Tuple tp = minHeap.poll();
20             if (i == k) {
21                 res = tp.val;
22                 break;
23             }
24             if (tp.y < matrix.length-1) minHeap.offer(new Tuple(tp.x, tp.y+1, matrix[tp.x][tp.y+1]));
25         }
26         return res;
27     }
28     
29     public class Tuple {
30             int x;
31             int y;
32             int val;
33             public Tuple(int i, int j, int value) {
34                 this.x = i;
35                 this.y = j;
36                 this.val = value;
37             }
38     }
39 }

 

Binary Search方法:(12/28仔细看了之后觉得没必要深究,有时间再去深究吧)

 1 public class Solution {
 2     public int kthSmallest(int[][] matrix, int k) {
 3         int lo = matrix[0][0], hi = matrix[matrix.length - 1][matrix[0].length - 1] + 1;//[lo, hi)
 4         while(lo < hi) {
 5             int mid = lo + (hi - lo) / 2;
 6             int count = 0,  j = matrix[0].length - 1;
 7             for(int i = 0; i < matrix.length; i++) {
 8                 while(j >= 0 && matrix[i][j] > mid) j--;
 9                 count += (j + 1);
10             }
11             if(count < k) lo = mid + 1;
12             else hi = mid;
13         }
14         return lo;
15     }
16 }

 

referred to https://discuss.leetcode.com/topic/52948/share-my-thoughts-and-clean-java-code/2

posted @ 2016-11-28 13:02  neverlandly  阅读(426)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3