【LetMeFly】1738.找出第 K 大的异或坐标值:二维前缀和
力扣题目链接:https://leetcode.cn/problems/find-kth-largest-xor-coordinate-value/
给你一个二维矩阵 matrix
和一个整数 k
,矩阵大小为 m x n
由非负整数组成。
矩阵中坐标 (a, b)
的 值 可由对所有满足 0 <= i <= a < m
且 0 <= j <= b < n
的元素 matrix[i][j]
(下标从 0 开始计数)执行异或运算得到。
请你找出 matrix
的所有坐标中第 k
大的值(k
的值从 1 开始计数)。
示例 1:
输入:matrix = [[5,2],[1,6]], k = 1
输出:7
解释:坐标 (0,1) 的值是 5 XOR 2 = 7 ,为最大的值。
示例 2:
输入:matrix = [[5,2],[1,6]], k = 2
输出:5
解释:坐标 (0,0) 的值是 5 = 5 ,为第 2 大的值。
示例 3:
输入:matrix = [[5,2],[1,6]], k = 3
输出:4
解释:坐标 (1,0) 的值是 5 XOR 1 = 4 ,为第 3 大的值。
示例 4:
输入:matrix = [[5,2],[1,6]], k = 4
输出:0
解释:坐标 (1,1) 的值是 5 XOR 2 XOR 1 XOR 6 = 0 ,为第 4 大的值。
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 1000
0 <= matrix[i][j] <= 106
1 <= k <= m * n
解题方法:二维前缀和
二位前缀和的介绍可以参考304.二维区域和检索 - 矩阵不可变
简单来说,就是使用一个前缀(异或)和数组prefix
,保证prefix[i + 1][j + 1]
的值为“matrix[0][0]
到matrix[i][j]
所有值的异或和”。
由于a ⊕ a = 0
,因此若想求得图中“左上角到黄色方块的异或和”,只需要红色⊕绿色⊕黄色⊕蓝色即可。(红色⊕绿色后蓝色部分抵消了,再异或一次蓝色正好)。
上图PPT地址:Tisfy - 1738.找出第 K 大的异或坐标值.pptx。
- 时间复杂度$O(N^2)$
- 空间复杂度$O(N\log N)$
AC代码
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Solution { public: int kthLargestValue(vector<vector<int>>& matrix, int k) { vector<vector<int>> prefix(matrix.size() + 1, vector<int>(matrix[0].size() + 1)); vector<int> vals; for (int i = 0; i < matrix.size(); i++) { for (int j = 0; j < matrix[0].size(); j++) { prefix[i + 1][j + 1] = prefix[i + 1][j] ^ prefix[i][j + 1] ^ prefix[i][j] ^ matrix[i][j]; vals.push_back(prefix[i + 1][j + 1]); } } sort(vals.begin(), vals.end()); return vals[vals.size() - k]; } };
|
Go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
func kthLargestValue(matrix [][]int, k int) int { prefix := make([][]int, len(matrix) + 1) prefix[0] = make([]int, len(matrix[0]) + 1) vals := make([]int, 0) for i := 0; i < len(matrix); i++ { prefix[i + 1] = make([]int, len(matrix[0]) + 1) for j := 0; j < len(matrix[0]); j++ { prefix[i + 1][j + 1] = prefix[i + 1][j] ^ prefix[i][j + 1] ^ prefix[i][j] ^ matrix[i][j] vals = append(vals, prefix[i + 1][j + 1]) } } sort.Ints(vals) return vals[len(vals) - k] }
|
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
class Solution { public int kthLargestValue(int[][] matrix, int k) { int[][] prefix = new int[matrix.length + 1][matrix[0].length + 1]; ArrayList<Integer> vals = new ArrayList<>(); for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix[0].length; j++) { prefix[i + 1][j + 1] = prefix[i + 1][j] ^ prefix[i][j + 1] ^ prefix[i][j] ^ matrix[i][j]; vals.add(prefix[i + 1][j + 1]); } } vals.sort(Comparator.naturalOrder()); return vals.get(vals.size() - k); } }
|
Python
1 2 3 4 5 6 7 8 9 10 11 12
|
class Solution: def kthLargestValue(self, matrix: List[List[int]], k: int) -> int: prefix = [[0] * (len(matrix[0]) + 1) for _ in range(len(matrix) + 1)] vals = [] for i in range(len(matrix)): for j in range(len(matrix[0])): prefix[i + 1][j + 1] = prefix[i + 1][j] ^ prefix[i][j + 1] ^ prefix[i][j] ^ matrix[i][j] vals.append(prefix[i + 1][j + 1]) vals.sort() return vals[-k]
|
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
若题解不是“五彩斑斓”的,也可以点击上述“原文链接”查看五彩斑斓版本。
Tisfy:https://letmefly.blog.csdn.net/article/details/139211887