【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^2) O(N2)
- 空间复杂度 O ( N log N ) O(N\log N) O(NlogN)
AC代码
C++
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
// package main
// import "sort"
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
// import java.util.ArrayList;
// import java.util.Comparator;
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
# from typing import List
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