leetcode 1738. 找出第 K 大的异或坐标值
本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接
题目
给你一个二维矩阵 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 大的值。
解题思路
- 维护一个前缀异或数组sum[i][j],代表以(i,j)为右下角的矩形的异或结果,因此sum[i][j]的值可以从sum[i-1][j],sum[i][j-1],sum[i-1][j-1]的结果中推出来,递推式为
sum[i][j]=sum[i-1][j]^sum[i][j-1]^sum[i-1][j-1]^matrix[i-1][j-1];
2. 将所有异或的数组进行一次排序,就能得出第k大的元素了
代码
class Solution {public int kthLargestValue(int[][] matrix, int k) {ArrayList<Integer> list = new ArrayList<>();int n=matrix.length,m=matrix[0].length,res=0;int[][] sum = new int[n + 1][m + 1];for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {sum[i][j]=sum[i-1][j]^sum[i][j-1]^sum[i-1][j-1]^matrix[i-1][j-1];list.add(sum[i][j]);}}Collections.sort(list);return list.get(list.size()-k);}
}
结果
使用优先队列进行排序
public int kthLargestValue(int[][] matrix, int k) {PriorityQueue<Integer> priorityQueue=new PriorityQueue<>();int n=matrix.length,m=matrix[0].length,res=0;int[][] sum = new int[n + 1][m + 1];for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {sum[i][j]=sum[i-1][j]^sum[i][j-1]^sum[i-1][j-1]^matrix[i-1][j-1];if(priorityQueue.size()<k){priorityQueue.add(sum[i][j]);}else if(priorityQueue.peek()<sum[i][j]){priorityQueue.poll();priorityQueue.add(sum[i][j]);}}}return priorityQueue.peek();}
结果
leetcode 1738. 找出第 K 大的异或坐标值相关推荐
- LeetCode 1738. 找出第 K 大的异或坐标值(DP)
文章目录 1. 题目 2. 解题 947 / 3851,前 24.6% 2533 / 11282,前 22.5% 1. 题目 给你一个二维矩阵 matrix 和一个整数 k ,矩阵大小为 m x n ...
- 文巾解题1738. 找出第 K 大的异或坐标值
1 题目描述 2 解题思路 设二维前缀和pre(i,j) 表示矩阵matrix 中所有满足0≤x<i 且 0≤y<j 的元素执行按位异或运算的结果 考虑pre矩阵的一个2×2 的子部分 p ...
- OpenJudge计算概论-找出第k大的数
/*================================================ 找出第k大的数 总时间限制: 1000ms 内存限制: 1000kB 描述 用户输入N和K,然后接 ...
- 面试题:从n个数中找出第K大的数
参考https://blog.csdn.net/orangefly0214/article/details/84997668的思路 从有n个元素的乱序数组中找出第k大的元素 方法1:基于冒泡排序和简单 ...
- LeetCode 719. 找出第 K 小的数对距离
719. 找出第 K 小的数对距离 [二分+二分] 首先对数组排序,然后算出最大值和最小值之间的差值,这个差值就是解空间的最大值,然后对解空间进行二分,每次对解空间的mid统计数对距离小于他的个数,通 ...
- 找出一个字符串中出现次数最多的字_海量数据中找出前k大数(topk问题)
在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题. 针对top K类问题,通常比较好的方案是分治+Trie树/hash+小顶堆(就是上面提到 ...
- 约瑟夫环——递推公式详解(leetcode 1823. 找出游戏的获胜者)
约瑟夫环--递推公式详解(leetcode 1823. 找出游戏的获胜者) 约瑟夫环问题 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知 n 个人(以编号1,2,3-n分别表示)围坐在一张圆桌周围. ...
- LeetCode 1823. 找出游戏的获胜者
LeetCode 1823. 找出游戏的获胜者 文章目录 LeetCode 1823. 找出游戏的获胜者 题目描述 一.解题关键词 二.解题报告 1.思路分析 2.时间复杂度 3.代码示例 2.知识点 ...
- 在两个已经排好序的数组里找出第K小的数
前言: 这道题是一道非常常见的面试题,也是一道能够考察一个人的编程能力和算法的一道题.如果要求复杂度为 O(k), 是比较容易做出来的,但是,一般来讲,面试官要求给出更低复杂度的算法.网上有很多不同的 ...
最新文章
- python 调试 cyberbrain 教程
- UVA11324-- The Largest Clique(SCC+DP)
- 第三次学JAVA再学不好就吃翔(part84)--增强for循环
- mybatis insert 忽略 联合唯一索引_MySQL实战中,Insert语句的使用心得总结
- [蓝桥杯2018决赛]阅兵方阵-模拟,枚举
- python打印星星居中_python实现while循环打印星星的四种形状
- Java面向对象(20)--接口
- C++学习之路 | PTA乙级——1092 最好吃的月饼 (20 分)(精简)
- c语言高低位拷贝_C语言指针详解
- mysql 数据库设置mysql注入_MYSQL数据库浅析MySQL的注入安全问题
- 探索篇 | 新奇测试策略剖析,大家都觉得多此一举(二)
- redis3.0伪集群安装步骤
- 千万别让海底捞知道你的生日
- InnoDB如何实现多版本
- WIN10__针对SMB的那啥
- 基于python的论文摘要怎么写_Django显示文章摘要需要如何写
- 3分钟看懂:7大教育培训企业邮件营销 (附案例)
- Dcloud学习资料汇总+视频教程
- nexus私服安装包
- 【快速简单登录认证】SpringBoot使用Sa-Token-Quick-Login插件快速登录认证
热门文章
- 单向循环链表C语言实现
- .net core 杂记:用Autofac替换内置容器
- Mybatis学习笔记18 - 缓存
- POJ3264 【RMQ基础题—ST-线段树】
- _UICreateCGImageFromIOSurface 使用API
- (转)CentOs 设置静态IP 方法
- Windows Phone开发(30):图形 转:http://blog.csdn.net/tcjiaan/article/details/7453028
- 一、策略模式(Strategy Pattern)
- AD:使用C#批量创建帐号
- 设计模式——中介者模式