zoukankan      html  css  js  c++  java
  • [378. 有序矩阵中第K小的元素]

    [378. 有序矩阵中第K小的元素]

    给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。
    请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素。

    示例:

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

    思路 : 在Matrix[0][0]~Matrix[length-1][length-1]之间二分查找一个数n, 遍历数组如果小于等于n的个数大于K, 则右边界缩小为n,反之左边界放大到n+1

    public class Q378 {
        public int kthSmallest(int[][] matrix, int k){
            int n = matrix.length;
            int left = matrix[0][0];
            int right = matrix[n-1][n-1];
    
            while (left < right){
                int mid = (left + right)>>1;
                if(check(matrix, k, mid)){
                    right = mid;
                }else {
                    left = mid+1;
                }
            }
            return left;
        }
    
        private boolean check(int[][] m ,int k , int n){
            int sum = 0;
            int num = 0;
            int i = m.length-1;
            int j = 0;
    
            while (i >= 0){
                if(m[i][j] <= n){
                    num++;
                    j++;
                    if(j >= m.length){
                        sum += num*(i+1);
                        break;
                    }
                }else {
                    i--;
                    sum += num;
                }
            }
    
            return sum >= k;
        }
    
        public static void main(String[] args) {
            System.out.println(new Q378().kthSmallest(new int[][]{{1, 5, 9}, {10, 11, 13}, {12, 13, 15}}, 8));
        }
    }
    
    因为我喜欢追寻过程中的自己
  • 相关阅读:
    Redis入门指南
    大公司都有哪些开源项目~~~阿里,百度,腾讯,360,新浪,网易,小米等
    01 背包问题和完全背包
    糖果(动规)
    数的划分(动规)
    鸣人的影分身(动规)
    股票买卖(动规)
    大盗阿福(动规)
    公共子序列(动规)
    滑雪(动规)
  • 原文地址:https://www.cnblogs.com/IzuruKamuku/p/14359757.html
Copyright © 2011-2022 走看看