找出第 K 大的异或坐标值
给你一个二维矩阵matrix和一个整数k,矩阵大小为mxn由非负整数组成。
矩阵中坐标(a,b)的值可由对所有满足0<=i<=a<m且0<=j<=b<n的元素matrix[i][j](下标从0开始计数)执行异或运算得到。
请你找出matrix的所有坐标中第k大的值(k的值从0开始计数)。
思路
- 哇,这个题真的看了很久都明白啥意思???
- 看了题解才明白题目的意思说:要定义一个矩阵,矩阵中的坐标为(a,b),该矩阵中的横坐标a满足0<=i<=a,纵坐标b满足0<=j<=b,分析下来就是说要满足比(a,b)小的matrix[i][j],执行异或运算得到。
- 比如a=i+1,b=j+1,则可得知求0<=i<=i+1,0<=j<=j+1的元素matrix[i][j](下标从0开始计数执行异或运算得到。
- 逆序排列,删除输出结果。
解法
func kthLargestValue(matrix [][]int, k int) int {
m:=len(matrix)
n:=len(matrix[0])
res:=[]int{} // 定义数组,存放异或值的结果
dp:=make([][]int,m+1) // 定义二维数组,存放前缀“异或值和”
for i:=0;i<m+1;i++{
dp[i]=make([]int,n+1)
}
for i:=0;i<m;i++{
for j:=0;j<n;j++{
dp[i+1][j+1]=dp[i][j]^dp[i][j+1]^dp[i+1][j]^matrix[i][j] // 计算比其小的前缀“异或值和”,切记异或当前指标
res=append(res,dp[i+1][j+1])
}
}
sort.Sort(sort.Reverse(sort.IntSlice(res))) // 将异或值逆序排序
return res[k-1]
}