云计算百科
云计算领域专业知识百科平台

有序矩阵中第K小的元素+二分查找

题目: 在这里插入图片描述 思考:

  • 最直观的思路是不管矩阵性质,直接遍历后排序(二维变一维)但这复杂度太高且完全没有利用矩阵中相对有序的性质
  • 第二种思路是拆分,n×n的矩阵,拆分成n个一维向量,这些一维向量都是有序的,相当于n个有序数组中找到第k小的,可以使用合并n个有序列表的方法,比如归并排序
  • 但是第二种只使用到了有序矩阵中一个方向上的有序性质
  • 使用二分查找,矩阵中最小的是matrix[0][0]设为min,最大的是matrix[n-1][n-1]设为max,利用二分查找实时查找矩阵中比(min+max)/2小的数的个数,刚好k个就找到了,小于k个说明真正的第k小元素要比(min+max)/2大,更新min的值,同理大于k个更新max的值
  • 那么方法的重难点就在于查找比(min+max)/2小的数的个数,可以遍历每一行去找,但还是要利用矩阵性质,从矩阵右上角开始找,相当于 240. 搜索二维矩阵 II 的方法
  • 实现:

    class Solution {
    public:
    int kthSmallest(vector<vector<int>>& matrix, int k) {
    int n=matrix.size();
    auto getCount=[&] (int mid)->int
    {
    int count=0;
    int x=0;
    int y=n1;
    while(y>1&&x<n)
    {
    if (matrix[x][y]<=mid)
    {
    count+=y+1;
    x++;
    }
    else
    {
    y;
    }
    }

    return count;
    };

    int l=matrix[0][0];
    int r=matrix[n1][n1];
    while(l<=r)
    {
    int mid=(l+r)/2;
    int count=getCount(mid);
    if (count<k)
    {
    l=mid+1;
    }
    else
    {
    r=mid1;
    }
    }

    return l;
    }
    };

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 有序矩阵中第K小的元素+二分查找
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!