zoukankan      html  css  js  c++  java
  • 378. 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.

     1 public class Solution {
     2     public int kthSmallest(int[][] matrix, int k) {
     3         int n = matrix.length;
     4         PriorityQueue<Wrapper> pq = new PriorityQueue<Wrapper>();
     5         for(int i=0;i<n;i++) pq.offer(new Wrapper(0,i,matrix[0][i]));
     6         for(int i=0;i<k-1;i++){
     7             Wrapper w = pq.poll();
     8             int x = w.x;
     9             if(x==n-1) continue;
    10             pq.offer(new Wrapper(x+1,w.y,matrix[x+1][w.y]));
    11         }
    12         return pq.poll().val;
    13     }
    14     class Wrapper implements Comparable<Wrapper>{
    15         int x;
    16         int y;
    17         int val;
    18         public Wrapper(int x,int y,int val){
    19             this.x = x;
    20             this.y = y;
    21             this.val = val;
    22         }
    23         public int compareTo(Wrapper that){
    24             return this.val-that.val;
    25         }
    26     }
    27 }
    28 //the run time complexity could be O(klongn), the space complexity could be O(k);
     1 public class Solution {
     2     public int kthSmallest(int[][] matrix, int k) {
     3         int left = matrix[0][0];
     4         int right = matrix[matrix.length-1][matrix.length-1]+1;
     5         while(left<right){
     6             int mid = left +(right-left)/2;
     7             int count = 0;
     8             int j = matrix.length-1;
     9             for(int i=0;i<matrix.length;i++){
    10                 while(j>=0&&matrix[i][j]>mid){
    11                     j--;
    12                 }
    13                 count+=j+1;
    14             }
    15             if(count<k) left = mid+1;
    16             else right = mid;
    17         }
    18         return left;
    19     }
    20 }
    21 //the run time complexity could be O()???
  • 相关阅读:
    此时的我,就像一个炸药包...
    我焦躁,并不只是心里承受,还是因为我上面担着。
    我们应该顶住压力
    git初识后的一些问题
    我近期应该找个机会休整一下了
    权限管理设计的一些感悟
    一个无用的功能
    关于IE8与FireFox中,button内字体总是有一个不垂直居中的问题
    Android之EditText文本框监听事件
    Android流量统计TrafficStats类的使用
  • 原文地址:https://www.cnblogs.com/codeskiller/p/6939468.html
Copyright © 2011-2022 走看看