You are given a 0-indexed two-dimensional integer array nums.
Return _the largestprime number that lies on at least one of the diagonals of _nums. In case, no prime is present on any of the diagonals, return 0.
Note that:
An integer is prime if it is greater than 1 and has no positive integer divisors other than 1 and itself.
An integer val is on one of the diagonals of nums if there exists an integer i for which nums[i][i] = val or an i for which nums[i][nums.length - i - 1] = val.
Input: nums =[[1,2,3],[5,6,7],[9,10,11]]Output: 11Explanation: The numbers 1,3,6,9, and 11 are the only numbers present on at least one of the diagonals. Highlighted cells are the diagonal primes(3 and 11). Since 11is the largest prime, we return11.
Input: nums =[[1,2,3],[5,17,7],[9,11,10]]Output: 17Explanation: The numbers 1,3,9,10, and 17 are all present on at least one of the diagonals. Highlighted cells are the diagonal primes(3 and 17).17is the largest prime, so we return17.
We need to find the largest prime number on either diagonal of a square matrix. Since the matrix nums can be up to n x n and values up to 4*10^6, we can check each diagonal value and test for primality (trial division up to sqrt(x)) efficiently.
#include<vector>#include<algorithm>#include<cmath>usingnamespace std;
boolisPrime(int x) {
if (x <2) return false;
if (x ==2) return true;
if (x %2==0) return false;
for (int i =3; i * i <= x; i +=2) {
if (x % i ==0) return false;
}
return true;
}
intdiagonalPrime(vector<vector<int>>& nums) {
int n = nums.size(), ans =0;
for (int i =0; i < n; ++i) {
if (isPrime(nums[i][i])) ans = max(ans, nums[i][i]);
if (isPrime(nums[i][n-i-1])) ans = max(ans, nums[i][n-i-1]);
}
return ans;
}
import"math"funcisPrime(xint) bool {
ifx < 2 {
returnfalse }
ifx==2 {
returntrue }
ifx%2==0 {
returnfalse }
fori:=3; i*i<=x; i+=2 {
ifx%i==0 {
returnfalse }
}
returntrue}
funcdiagonalPrime(nums [][]int) int {
n:= len(nums)
ans:=0fori:=0; i < n; i++ {
ifisPrime(nums[i][i]) &&nums[i][i] > ans {
ans = nums[i][i]
}
ifisPrime(nums[i][n-i-1]) &&nums[i][n-i-1] > ans {
ans = nums[i][n-i-1]
}
}
returnans}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
classSolution {
privatebooleanisPrime(int x) {
if (x < 2) returnfalse;
if (x == 2) returntrue;
if (x % 2 == 0) returnfalse;
for (int i = 3; i * i <= x; i += 2) {
if (x % i == 0) returnfalse;
}
returntrue;
}
publicintdiagonalPrime(int[][] nums) {
int n = nums.length, ans = 0;
for (int i = 0; i < n; ++i) {
if (isPrime(nums[i][i])) ans = Math.max(ans, nums[i][i]);
if (isPrime(nums[i][n-i-1])) ans = Math.max(ans, nums[i][n-i-1]);
}
return ans;
}
}
funisPrime(x: Int): Boolean {
if (x < 2) returnfalseif (x ==2) returntrueif (x % 2==0) returnfalsevar i = 3while (i * i <= x) {
if (x % i ==0) returnfalse i +=2 }
returntrue}
fundiagonalPrime(nums: Array<IntArray>): Int {
val n = nums.size
var ans = 0for (i in0 until n) {
if (isPrime(nums[i][i])) ans = maxOf(ans, nums[i][i])
if (isPrime(nums[i][n-i-1])) ans = maxOf(ans, nums[i][n-i-1])
}
return ans
}
from typing import List
defis_prime(x: int) -> bool:
if x <2:
returnFalseif x ==2:
returnTrueif x %2==0:
returnFalse i =3while i * i <= x:
if x % i ==0:
returnFalse i +=2returnTruedefdiagonalPrime(nums: List[List[int]]) -> int:
n = len(nums)
ans =0for i in range(n):
if is_prime(nums[i][i]):
ans = max(ans, nums[i][i])
if is_prime(nums[i][n-i-1]):
ans = max(ans, nums[i][n-i-1])
return ans
fnis_prime(x: i32) -> bool {
if x <2 {
returnfalse;
}
if x ==2 {
returntrue;
}
if x %2==0 {
returnfalse;
}
letmut i =3;
while i * i <= x {
if x % i ==0 {
returnfalse;
}
i +=2;
}
true}
fndiagonal_prime(nums: Vec<Vec<i32>>) -> i32 {
let n = nums.len();
letmut ans =0;
for i in0..n {
if is_prime(nums[i][i]) && nums[i][i] > ans {
ans = nums[i][i];
}
if is_prime(nums[i][n-i-1]) && nums[i][n-i-1] > ans {
ans = nums[i][n-i-1];
}
}
ans
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
exportfunctiondiagonalPrime(nums: number[][]):number {
functionisPrime(x: number):boolean {
if (x<2) returnfalse;
if (x===2) returntrue;
if (x%2===0) returnfalse;
for (leti=3; i*i<=x; i+=2) {
if (x%i===0) returnfalse;
}
returntrue;
}
constn=nums.length;
letans=0;
for (leti=0; i<n; ++i) {
if (isPrime(nums[i][i])) ans= Math.max(ans, nums[i][i]);
if (isPrime(nums[i][n-i-1])) ans= Math.max(ans, nums[i][n-i-1]);
}
returnans;
}