题目

2614. 对角线上的质数

给你一个下标从 0 开始的二维整数数组 nums

返回位于 nums 至少一条 对角线 上的最大 质数 。如果任一对角线上均不存在质数,返回 0 。

注意:

  • 如果某个整数大于 1 ,且不存在除 1 和自身之外的正整数因子,则认为该整数是一个质数。
  • 如果存在整数 i ,使得 nums[i][i] = val 或者 nums[i][nums.length - i - 1]= val ,则认为整数 val 位于 nums 的一条对角线上。

在上图中,一条对角线是 [1,5,9] ,而另一条对角线是 [3,5,7]

示例 1:

输入:nums = [[1,2,3],[5,6,7],[9,10,11]]
输出:11
解释:数字 1、3、6、9 和 11 是所有 "位于至少一条对角线上" 的数字。由于 11 是最大的质数,故返回 11 。

示例 2:

输入:nums = [[1,2,3],[5,17,7],[9,11,10]]
输出:17
解释:数字 1、3、9、10 和 17 是所有满足"位于至少一条对角线上"的数字。由于 17 是最大的质数,故返回 17 。

提示:

  • 1 <= nums.length <= 300
  • nums.length == numsi.length
  • 1 <= nums[i][j] <= 4*106

思路

​ 本题没什么弯弯绕绕,直接模拟即可。由于在提示中限制了nums.length == numsi.length,2条对角线都是完整的,不需要额外考虑边界:

  • 第1条对角线nums[i][i]
  • 第2条对角线nums[i][n-1-i]

判断质数

​ 对于1个正整数n,如何判断它是不是质数呢?

​ 可以先假设n是合数,那么n必然可以分解成n = x * yx <= y(仅为说明问题,如果 x > y,那么可以交换 x 和 y 来满足 x <= y),显然 x <= sqrt(n)。所以,可以遍历[2, sqrt(n)],如果n能整除其中某个数,就一定是合数。

​ 还有一个额外的注意点是:1既不是质数,也不是合数,需要单独额外判断。

代码

public int diagonalPrime(int[][] nums) {
int ans = 0;
int n = nums.length;
for (int i = 0; i < n; i++) {
if (nums[i][i] > ans && isPrime(nums[i][i])) {
ans = nums[i][i];
}
if (nums[i][n-1-i] > ans && isPrime(nums[i][n-1-i])) {
ans = nums[i][n-1-i];
}
}
return ans;
} private boolean isPrime(int n) {
if (n == 1) {
return false;
}
for (int i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0) {
return false;
}
}
return true;
}

​ 这里还有1个小优化:由于isPrime方法需要遍历[2, sqrt(n)]这个范围,相对于nums[i][i] > ans这个判断是比较耗时的,所以我们在写if条件的时候,可以把isPrime方法写在后面,这样如果前面不满足就会短路掉,加快处理的速度。

耗时

预处理

​ 考虑到提示中给出的数的范围[1, 4 * 10^6],这个范围不是很大,在判断质数这一步,我们可以先预处理,求出范围内所有的质数,这样就不用每次调用isPrime方法判断了。这里用到的方法是打表求质数,打表的方式可以简单理解为isPrime方法的逆向:我们不直接从n出发,而是从因子出发,如果n = x * y,n 可以看作是 x 的 y 被,我们把范围内所有的满足 x 的 y 倍的数,都标记成合数,那么剩余的,就都是质数了。同样的,这里也需要对1这个既不是质数,也不是合数的特殊值,进行额外判断。

​ 预处理的优点是,我们保存预处理的结果后,后续的质数判断这一步会变快,当然也付出了存储空间和预处理时间的代价。如果我们的二维数组很大,需要判断是否是质数的次数很大,这个预处理的消耗就会比较值得;如果二维数组很小,且数值的理论范围很大,实际范围比较小,就得不偿失了。

代码

private static final boolean[] isPrimeArr = getPrimeArr(4000000);

public int diagonalPrime(int[][] nums) {
int ans = 0;
int n = nums.length;
for (int i = 0; i < n; i++) {
if (nums[i][i] > ans && isPrimeArr[nums[i][i]]) {
ans = nums[i][i];
}
if (nums[i][n-1-i] > ans && isPrimeArr[nums[i][n-i-1]]) {
ans = nums[i][n-1-i];
}
}
return ans;
} private static boolean[] getPrimeArr(int n) {
boolean[] isPrimeArr = new boolean[n + 1];
Arrays.fill(isPrimeArr, true);
isPrimeArr[1] = false;
for (int i = 2; i <= Math.sqrt(n); i++) {
for (int j = i + i; j <= n; j += i) {
isPrimeArr[j] = false;
}
}
return isPrimeArr;
}

耗时

leetcode每日一题:对角线上的质数的更多相关文章

  1. 【JavaScript】Leetcode每日一题-在D天内送包裹的能力

    [JavaScript]Leetcode每日一题-在D天内送包裹的能力 [题目描述] 传送带上的包裹必须在 D 天内从一个港口运送到另一个港口. 传送带上的第 i 个包裹的重量为 weights[i] ...

  2. 【JavaScript】Leetcode每日一题-青蛙过河

    [JavaScript]Leetcode每日一题-青蛙过河 [题目描述] 一只青蛙想要过河. 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有). 青蛙可以跳上石子 ...

  3. 【JavaScript】Leetcode每日一题-矩形区域不超过K的最大值和

    [JavaScript]Leetcode每日一题-矩形区域不超过K的最大值和 [题目描述] 给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大 ...

  4. 【JavaScript】【KMP】Leetcode每日一题-实现strStr()

    [JavaScript]Leetcode每日一题-实现strStr() [题目描述] 实现 strStr() 函数. 给你两个字符串 haystack 和 needle ,请你在 haystack 字 ...

  5. [LeetCode每日一题]153.寻找旋转排序数组中的最小值

    [LeetCode每日一题]153.寻找旋转排序数组中的最小值 问题 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1, ...

  6. [LeetCode每日一题]81. 搜索旋转排序数组 II

    [LeetCode每日一题]81. 搜索旋转排序数组 II 问题 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 & ...

  7. 【python】Leetcode每日一题-存在重复元素3

    [python]Leetcode每日一题-存在重复元素3 [题目描述] 给你一个整数数组 nums 和两个整数 k 和 t .请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] ...

  8. 【python】Leetcode每日一题-扰乱字符串

    [python]Leetcode每日一题-扰乱字符串 [题目描述] 使用下面描述的算法可以扰乱字符串 s 得到字符串 t : 如果字符串的长度为 1 ,算法停止 如果字符串的长度 > 1 ,执行 ...

  9. 【python】Leetcode每日一题-搜索排序数组2

    [python]Leetcode每日一题-搜索排序数组2 [题目描述] 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k( ...

  10. 【python】Leetcode每日一题-二叉搜索迭代器

    [python]Leetcode每日一题-二叉搜索迭代器 [题目描述] 实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器: BSTIterator(T ...

随机推荐

  1. 【Java RPC】使用netty手写一个RPC框架 结合新特性 虚拟线程

    [手写RPC框架]如何使用netty手写一个RPC框架 结合新特性 虚拟线程 什么是RPC框架 RPC(Remote Procedure Call)远程过程调用,是一种通过网络从远程计算机程序上请求服 ...

  2. Solution Set - “女孩是瑰宝我心动一丝不苟”

    目录 0.「NOI Simu.」静态顶树 1.「NOI Simu.」祖先 2.「NOI Simu.」睡眠 3.「JLOI 2008」「洛谷 P3881」CODES 4.「ARC 163A」Divide ...

  3. AsyncLocal的妙用

    AsyncLocal<T>是一个在.NET中用来在同步任务和异步任务中保持全局变量的工具类. 它允许你在不同线程的同一个对象中保留一个特定值,这样你可以在不同的函数和任务中访问这个值. 这 ...

  4. 2020年最新版区块链面试题2-copy

    1. 问:你认为区块链技术中的区块意味着什么? 区块链由所有金融交易的信息组成.一个块只不过是一个记录列表.当这些列表相互结合时,它们被称为区块链.例如,一个组织有100个分类账簿,其中的组合被称为区 ...

  5. 学Shiro完结版-1

    第一章 Shiro简介--<跟我学Shiro> 1.1  简介 Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spr ...

  6. java重载-构造方法也存在重载-数据类型的提升

    重载 1.一个类中不能声明多个相同的方法,属性. 2.上面的相同指的是方法名,参数列表相同.和返回值类型无关. 3.如果方法名相同,但是参数列表(个数,顺序,类型)不相同,会认为是不同的方法,在jav ...

  7. Web安全知识记录

    本文分享自天翼云开发者社区<Web安全知识记录>,作者:赵****雅 1.网站置于服务器中,而服务器则是指连接在网络中的一台计算机.当我们浏览网站时,实际上就是我们用个人计算机通过网络访问 ...

  8. 浅谈云主机在VPC中进行迁移的使用场景和操作方法

    本文分享自天翼云开发者社区<浅谈云主机在VPC中进行迁移的使用场景和操作方法>,作者:刘****雪 一.客户经常遇到的网络迁移问题 客户在天翼云购买一台云主机并且部署完成想要的应用后,发现 ...

  9. 解决tsc编译器版本过低问题

    我们知道,tsc是TypeScript的编译器,可以将TypeScript脚本(.ts文件)编译为JavaScript脚本(.js文件).根据约定,TypeScript脚本文件使用.ts后缀名,Jav ...

  10. PHP变量与变量作用域

    PHP变量与变量作用域 1. 变量的基本概念 在PHP中,变量用于存储各种类型的数据,如字符串.整数.浮点数.布尔值.数组和对象等.变量名以美元符号$开头,后面跟着一个或多个字符(变量名).例如: & ...