1738. 找出第 K 大的异或坐标值(二维前缀和 + 排序)

题目来源:1738. 找出第 K 大的异或坐标值

  给你一个二维矩阵 matrix 和一个整数 k ,矩阵大小为 m x n 由非负整数组成。
矩阵中坐标 (a, b) 的 值 可由对所有满足 0 <= i <= a < m 且 0 <= j <= b < n 的元素 matrix[i][j](下标从 0 开始计数)执行异或运算得到。
请你找出 matrix 的所有坐标中第 k 大的值(k 的值从 1 开始计数)。
/**
 * @param {number[][]} matrix
 * @param {number} k
 * @return {number}
 */
 var kthLargestValue = function(matrix, k) {
    let m = matrix.length;
    let n = matrix[0].length;
    let dp = new Array(m).fill(0).map(()=>new Array(n).fill(0));
    let res = [];
    for(let i=0;i<m;i++){
        for(let j=0;j<n;j++){
            dp[i][j]=(i==0 && j==0)?matrix[i][j]:(dp[i][j-1]^matrix[i][j]);            
        }
    }
    res.push(...dp[0]);
    for(let i=1;i<m;i++){
        for(let j=n-1;j>=0;j--){
            dp[i][j] = dp[i][j]^dp[i-1][j];
            res.push(dp[i][j])
        }
    }
    return res.sort((a,b)=>b-a)[k-1];
};
//优化
 var kthLargestValue = function(matrix, k) {
    let m = matrix.length;
    let n = matrix[0].length;
    let pre = new Array(m+1).fill(0).map(()=>new Array(n+1).fill(0));
    let res = [];
    for(let i=1;i<=m;i++){
        for(let j=1;j<=n;j++){
            pre[i][j]=pre[i-1][j]^pre[i][j-1]^pre[i-1][j-1]^matrix[i-1][j-1];
            res.push(pre[i][j]);
        }
    }
    return res.sort((a,b)=>b-a)[k-1];
};
let matrix = [[5,2],[1,6]], k = 1;
console.log(matrix, k, kthLargestValue(matrix,k))
matrix = [[5,2],[1,6]], k = 2
console.log(matrix, k, kthLargestValue(matrix,k))
matrix = [[5,2],[1,6]], k = 3
console.log(matrix, k, kthLargestValue(matrix,k))
matrix = [[5,2],[1,6]], k = 4
console.log(matrix, k, kthLargestValue(matrix,k))

思考:未优化前多做了一次遍历,没有充分利用异或的特性

提示:

m == matrix.length
n == matrix[i].length
1 <= m, n <= 1000
0 <= matrix[i][j] <= 106
1 <= k <= m * n
posted @ 2021-05-19 09:50  尖子  阅读(84)  评论(0编辑  收藏  举报