zoukankan      html  css  js  c++  java
  • leetcode每日一题(2020-07-02):378. 有序矩阵中第K小的元素

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

    今日学习:
    1.复习reduce
    2.归并排序

    题解:
    1.直接合成一个数组然后sort
    2.二分查找
    3.归并排序

    //令人羞耻的方法
    var kthSmallest = function(matrix, k) {
        let arr = []
        for(let i = 0; i < matrix.length; i++) {
            arr = arr.concat(matrix[i])
        }
        arr.sort((a, b) => a - b)
        return arr[k - 1]
    };
    //二分查找
    const getRankInMatrix = (matrix, midVal) => {
      const n = matrix.length;
      let rank = 0;
      let row = 0;                        // 第一行
      let col = n - 1;                    // 最后一列
      while (row < n && col >= 0) {
        if (midVal >= matrix[row][col]) { // 干掉了当前行的老大
          rank += col + 1;                // 干掉了col个数,排名上涨col+1
          row++;                          // 比较下一行
        } else {                          // 干不过当前行的老大
          col--;                          // 留在当前行继续比较
        }
      }
      return rank;
    };
    const kthSmallest = (matrix, k) => {
      const n = matrix.length;
      let low = matrix[0][0];
      let high = matrix[n - 1][n - 1];
      while (low <= high) {
        const midVal = low + ((high - low) >>> 1);    // 获取中间值
        const rank = getRankInMatrix(matrix, midVal); // 矩阵中小于等于它的个数
        if (rank < k) {
          low = midVal + 1;
        } else {
          high = midVal - 1;
        }
      }
      return low;
    };
    //归并
    var kthSmallest = function(matrix, k) {
      if(matrix.length < 1) return 0
      let arr = matrix.reduce((a, b) => merge(a, b))
      return arr[k - 1]
    };
    function merge(left, right){
      let llen = left.length
      let rlen = right.length
      let i = 0
      let j = 0
      let res = []
      while(i < llen && j < rlen){
        if (left[i] < right[j]) {
          res.push(left[i++])
        } else {
          res.push(right[j++])
        }
      }
      while(i < llen) res.push(left[i++])
      while(j < rlen) res.push(right[j++])
      return res
    }
    
  • 相关阅读:
    解决IE8不兼容通过class名获取元素的方法
    移动端页面遇到过的各种坑
    强大的正则表达式
    弹性盒子布局
    vue环境搭建
    fullpage.js使用指南
    ES5原生api(1)
    双色球中奖率分析(python)
    使用python脚本的3D引擎Panda3d
    Python lambda介绍
  • 原文地址:https://www.cnblogs.com/autumn-starrysky/p/13224046.html
Copyright © 2011-2022 走看看