ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-05-20 16:03:01  阅读:225  来源: 互联网

标签:1738 matrix length kthLargestValue 异或 let 坐标值 dp fill


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

标签:1738,matrix,length,kthLargestValue,异或,let,坐标值,dp,fill
来源: https://blog.51cto.com/u_15201483/2794276

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有