1738. 找出第 K 大的异或坐标值
2021-05-19 LeetCode每日一题
链接:https://leetcode-cn.com/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 开始计数)。
输入:matrix = [[5,2],[1,6]], k = 1
输出:7
解释:坐标 (0,1) 的值是 5 XOR 2 = 7 ,为最大的值。
输入:matrix = [[5,2],[1,6]], k = 2
输出:5
解释:坐标 (0,0) 的值是 5 = 5 ,为第 2 大的值。
输入:matrix = [[5,2],[1,6]], k = 3
输出:4
解释:坐标 (1,0) 的值是 5 XOR 1 = 4 ,为第 3 大的值。
输入: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
分析
由题意可知,坐标(a, b)的值其实就是该点的左上角区域所有数的亦或值。

即图中绿色区域的部分。定义任何一点(a, b)的值为values[i][j],那么对于任何一点(a, b),它的值为
values[i] [j] = values[i - 1] [j] ^ values[i] [j - 1] ^ values[i - 1] [j - 1] ^ matrix[i - 1] [j - 1]

接下来的如何去实现了,对于每个坐标的亦或值,可以利用二维前缀和,用一个二维数组迭代求值,然后把每个值放入一个一维数组,最后对一维数组排序,拿到第K大的值即可。
一开始我的想法是利用一个TreeSet去存储异或值,因为TreeSet能帮我们排序,后来发现Set不能存储重复元素,所以不太好弄,就换成了一维数组。
class Solution {
public int kthLargestValue(int[][] matrix, int k) {
int m = matrix.length, n = matrix[0].length, count = 0;
int[][] values = new int[m + 1][n + 1];
int[] res = new int[m * n];
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
values[i][j] = (values[i][j - 1] ^ values[i - 1][j] ^ values[i - 1][j - 1] ^ matrix[i - 1][j - 1]);
res[count++] = values[i][j];
}
}
// 升序数组
Arrays.sort(res);
return res[res.length - k];
}
}
时间复杂度O(m * n),空间复杂度O(m * n)

1738. 找出第 K 大的异或坐标值的更多相关文章
- 刷题-力扣-1738. 找出第 K 大的异或坐标值
1738. 找出第 K 大的异或坐标值 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-kth-largest-xor-co ...
- OpenJudge计算概论-找出第k大的数
/*================================================ 找出第k大的数 总时间限制: 1000ms 内存限制: 1000kB 描述 用户输入N和K,然后接 ...
- 【基础算法】排序-复杂排序之二(找出第K大的数)
切割的思想是高速排序最精髓的地方.每一次切割出来的元素K一个排在第K位,所以利用这样的思想我们至少知道3点 1. 被切割出来的元素K最后一定排在第K位. 2. 在K左边的元素一定比K小或者相等. 3. ...
- 从数组中找出第K大的数
利用改进的快排方法 public class QuickFindMaxKValue { public static void main(String[] args) { int[] a = {8, 3 ...
- 海量数据中找出前k大数(topk问题)
海量数据中找出前k大数(topk问题) 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小 ...
- 排序练习——找出前m大的数字 分类: 排序 2015-06-08 09:33 21人阅读 评论(0) 收藏
排序练习--找出前m大的数字 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 给定n个数字,找出前m大的数字. 输入 多组输 ...
- 719. 找出第 K 小的数对距离
719. 找出第 K 小的数对距离 这道题其实有那么一点二分猜答案的意思,也有很多类似题目,只不过这道题确实表达的不是很清晰不容易想到,题没问题,我的问题.既然是猜答案,那么二分边界自然就是距离最大值 ...
- 【机试题】c# 是否是素数,找出比它大的第一个素数
题目: 输入一个自然数 判断是否是素数,是素数则提示是素数,否则找出比它大的第一个素数 代码: Console.WriteLine("请输入任意一个自然数."); string n ...
- Java实现 LeetCode 719 找出第 k 小的距离对(二分搜索法+二分猜数字)
719. 找出第 k 小的距离对 给定一个整数数组,返回所有数对之间的第 k 个最小距离.一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值. 示例 1: 输入: nums = [1,3, ...
随机推荐
- Windows核心编程 第23章 结束处理程序
第2 3章 结束处理程序 SEH(结构化异常处理) 使用 S E H的好处就是当你编写程序时,只需要关注程序要完成的任务. 如果在运行时发生什么错误,系统会发现并将发生的问题通知你.利用S E H,你 ...
- Day004 Scanner进阶
Scanner进阶 例1 Scanner scanner = new Scanner(System.in); //从键盘接收数据 int i = 0; float f = 0.0f; System.o ...
- HashMap实现原理一步一步分析(1-put方法源码整体过程)
各位同学大家好, 今天给大家分享一下HashMap内部的实现原理, 这一块也是在面试过程当中基础部分被问得比较多的一部分. 想要搞清楚HashMap内部的实现原理,我们需要先对一些基本的概念有一些了解 ...
- flex布局的使用
一.Flex布局是什么? Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为Flex布局. .box{ disp ...
- 安装MySQL后,需要调整的10个性能配置项
本文翻译自 Percona 官方博客,适用于 MySQL 5.6 及 5.7 版本. 作者:Stephane Combaudon 原文: https://www.percona.com/blog/20 ...
- copy函数与ostream_iterator、reverse_iterator
#include <iostream> #include <iterator> #include <vector> int main() { using names ...
- 消息队列RabbitMQ(二):RabbitMQ的系统架构概述
前言 RabbitMQ是基于AMQP协议的,要想深入理解RabbitMQ,就必须先了解AMQP是个什么东东? AMQP协议 AMQP即Advanced Message Queuing Protocol ...
- Word·去掉复制粘贴自动添加的空格
阅文时长 | 0.05分钟 字数统计 | 145.6字符 主要内容 | 1.引言&背景 2.声明与参考资料 『Word·去掉复制粘贴自动添加的空格』 编写人 | SCscHero 编写时间 | ...
- [bug] idea编译后没有xml文件
原因 在maven中build 参考 https://www.cnblogs.com/lewskay/p/6422464.html https://blog.csdn.net/lovequanquqn ...
- [bug] eclipse 点击new菜单后没有新建java project或class选项
参考 https://blog.csdn.net/u013001763/article/details/54405758