题目来源: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