LeetCode(19)找出第K大的异或坐标值(中等)
问题描述:
给你一个二维矩阵 matrix 和一个整数 k ,矩阵大小为 m x n 由非负整数组成。
矩阵中坐标 (a, b) 的 值 可由对所有满足 0 <= i <= a < m 且 0 <= j <= b < n 的元素 matrix[i][j](下标从 0 开始计数)执行异或运算得到。
请你找出 matrix 的所有坐标中第 k 大的值(k 的值从 1 开始计数)。
代码:
class Solution {
    public int kthLargestValue(int[][] matrix, int k) {
        int m = matrix.length, n = matrix[0].length;
        int[][] pre = new int[m + 1][n + 1];
        List<Integer> results = new ArrayList<Integer>();
        for (int i = 1; i <= m; ++i) {
            for (int 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];
                results.add(pre[i][j]);
            }
        }
        Collections.sort(results, new Comparator<Integer>() {
            public int compare(Integer num1, Integer num2) {
                return num2 - num1;
            }
        });
        return results.get(k - 1);
    }
}
值得注意的:
由于pre[i][j]可以由pre[i-1][j]⊕pre[i][j-1]⊕matrix[i][j]得到 并且
我们将pre(i−1,j) 和pre(i,j−1) 进行按位异或运算后,由于对一个数 x 异或两次 yy,结果仍然为 x 本身,即:
x⊕y⊕y=x
因此 pre(i−1,j−1) 对应区域的按位异或结果被抵消,我们需要将其补上,并对位置 (i, j)(i,j) 的元素进行按位异或运算,这样就得到了 pre(i,j)。
设置pre[][]=int[m + 1][n + 1]放置接下来的 m 行和 n 列存储二维前缀和,直接得到数组下标
最后进行排序得到第k大的数值。
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号