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
上一篇:学习踩坑:在Vue项目中使用svg标签却无法改变图标的颜色


下一篇:System.IndexOutOfRangeException: 无法找到表 0解决办法