1738.找出第 K 大的异或坐标值

【LetMeFly】1738.找出第 K 大的异或坐标值:二维前缀和

力扣题目链接:https://leetcode.cn/problems/find-kth-largest-xor-coordinate-value/

给你一个二维矩阵 matrix 和一个整数 k ,矩阵大小为 m x n 由非负整数组成。

矩阵中坐标 (a, b) 可由对所有满足 0 <= i <= a < m0 <= 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
// 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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 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

1
2
3
4
5
6
7
8
9
10
11
12
# 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


1738.找出第 K 大的异或坐标值
https://blog.letmefly.xyz/2024/05/26/LeetCode 1738.找出第K大的异或坐标值/
作者
Tisfy
发布于
2024年5月26日
许可协议