本文正在参加「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 大的值。

解题思路

  1. 维护一个前缀异或数组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 大的异或坐标值相关推荐

  1. LeetCode 1738. 找出第 K 大的异或坐标值(DP)

    文章目录 1. 题目 2. 解题 947 / 3851,前 24.6% 2533 / 11282,前 22.5% 1. 题目 给你一个二维矩阵 matrix 和一个整数 k ,矩阵大小为 m x n ...

  2. 文巾解题1738. 找出第 K 大的异或坐标值

    1 题目描述 2 解题思路 设二维前缀和pre(i,j) 表示矩阵matrix 中所有满足0≤x<i 且 0≤y<j 的元素执行按位异或运算的结果 考虑pre矩阵的一个2×2 的子部分 p ...

  3. OpenJudge计算概论-找出第k大的数

    /*================================================ 找出第k大的数 总时间限制: 1000ms 内存限制: 1000kB 描述 用户输入N和K,然后接 ...

  4. 面试题:从n个数中找出第K大的数

    参考https://blog.csdn.net/orangefly0214/article/details/84997668的思路 从有n个元素的乱序数组中找出第k大的元素 方法1:基于冒泡排序和简单 ...

  5. LeetCode 719. 找出第 K 小的数对距离

    719. 找出第 K 小的数对距离 [二分+二分] 首先对数组排序,然后算出最大值和最小值之间的差值,这个差值就是解空间的最大值,然后对解空间进行二分,每次对解空间的mid统计数对距离小于他的个数,通 ...

  6. 找出一个字符串中出现次数最多的字_海量数据中找出前k大数(topk问题)

    在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题. 针对top K类问题,通常比较好的方案是分治+Trie树/hash+小顶堆(就是上面提到 ...

  7. 约瑟夫环——递推公式详解(leetcode 1823. 找出游戏的获胜者)

    约瑟夫环--递推公式详解(leetcode 1823. 找出游戏的获胜者) 约瑟夫环问题 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知 n 个人(以编号1,2,3-n分别表示)围坐在一张圆桌周围. ...

  8. LeetCode 1823. 找出游戏的获胜者

    LeetCode 1823. 找出游戏的获胜者 文章目录 LeetCode 1823. 找出游戏的获胜者 题目描述 一.解题关键词 二.解题报告 1.思路分析 2.时间复杂度 3.代码示例 2.知识点 ...

  9. 在两个已经排好序的数组里找出第K小的数

    前言: 这道题是一道非常常见的面试题,也是一道能够考察一个人的编程能力和算法的一道题.如果要求复杂度为 O(k), 是比较容易做出来的,但是,一般来讲,面试官要求给出更低复杂度的算法.网上有很多不同的 ...

最新文章

  1. python 调试 cyberbrain 教程
  2. UVA11324-- The Largest Clique(SCC+DP)
  3. 第三次学JAVA再学不好就吃翔(part84)--增强for循环
  4. mybatis insert 忽略 联合唯一索引_MySQL实战中,Insert语句的使用心得总结
  5. [蓝桥杯2018决赛]阅兵方阵-模拟,枚举
  6. python打印星星居中_python实现while循环打印星星的四种形状
  7. Java面向对象(20)--接口
  8. C++学习之路 | PTA乙级——1092 最好吃的月饼 (20 分)(精简)
  9. c语言高低位拷贝_C语言指针详解
  10. mysql 数据库设置mysql注入_MYSQL数据库浅析MySQL的注入安全问题
  11. 探索篇 | 新奇测试策略剖析,大家都觉得多此一举(二)
  12. redis3.0伪集群安装步骤
  13. 千万别让海底捞知道你的生日
  14. InnoDB如何实现多版本
  15. WIN10__针对SMB的那啥
  16. 基于python的论文摘要怎么写_Django显示文章摘要需要如何写
  17. 3分钟看懂:7大教育培训企业邮件营销 (附案例)
  18. Dcloud学习资料汇总+视频教程
  19. nexus私服安装包
  20. 【快速简单登录认证】SpringBoot使用Sa-Token-Quick-Login插件快速登录认证

热门文章

  1. 单向循环链表C语言实现
  2. .net core 杂记:用Autofac替换内置容器
  3. Mybatis学习笔记18 - 缓存
  4. POJ3264 【RMQ基础题—ST-线段树】
  5. _UICreateCGImageFromIOSurface 使用API
  6. (转)CentOs 设置静态IP 方法
  7. Windows Phone开发(30):图形 转:http://blog.csdn.net/tcjiaan/article/details/7453028
  8. 一、策略模式(Strategy Pattern)
  9. AD:使用C#批量创建帐号
  10. 设计模式——中介者模式