240. 搜索二維矩陣 II 378. 有序矩陣中第K小的元素

原文 https://www.b2bchain.cn/5718.html 

240. 搜索二維矩陣 II 

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        if(matrix==null||matrix.length==0||matrix[0].length==0) return false;
        int rows=matrix.length-1;
        int cols=matrix[0].length-1;
        int row=0; int col=cols;
        while(row<=rows && col>=0){
            if(matrix[row][col]==target) return true;
            else if(matrix[row][col]<target) row++;
            else col--;
        }
        return false;
    }
}

378. 有序矩陣中第K小的元素 

//給定一個 n x n 矩陣,其中每行和每列元素均按升序排序,找到矩陣中第 k 小的元素。 
//請注意,它是排序後的第 k 小元素,而不是第 k 個不同的元素。 
//
// 
//
// 示例: 
//
// matrix = [
//   [ 1,  5,  9],
//   [10, 11, 13],
//   [12, 13, 15]
//],
//k = 8,
//
//返回 13。
// 
//
// 
//
// 提示: 
//你可以假設 k 的值永遠是有效的,1 ≤ k ≤ n2 。 
// Related Topics 堆 二分查找


//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int kthSmallest(int[][] matrix, int k) {
        int n=matrix.length-1;
        int left=matrix[0][0];
        int right=matrix[n][n];
        while(left<right){
            int mid=left+(right-left)/2;
            if(checkNum(n,k,mid,matrix)) right=mid;
            else left=mid+1;
        }
        return left;
    }

    public boolean checkNum(int n,int k,int target,int[][] matrix){
        int row=0; int col=n;
        int num=0;
        while(row<=n && col>=0){

             if(matrix[row][col]<=target) {
                 //這個位置是col+1
                 num+=col+1;
                 row++;
             }
            else col--;
        }
        return num>=k;
    }

}
//leetcode submit region end(Prohibit modification and deletion)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章