2614.对角线上的质数
链接:2614.对角线上的质数
难度:Easy
标签:数组、数学、矩阵、数论
简介:给你一个下标从 0 开始的二维整数数组 nums 。返回位于 nums 至少一条 对角线 上的最大 质数 。如果任一对角线上均不存在质数,返回 0 。
题解 1 - rust
- 编辑时间:2023-04-09
- 执行用时:16ms
- 内存消耗:3.6MB
- 编程语言:rust
- 解法介绍:同上。
impl Solution {
    pub fn diagonal_prime(nums: Vec<Vec<i32>>) -> i32 {
        use std::cmp::max;
        let check = |num: i32| {
            if num == 1 {
                false
            } else {
                let mut i = 2;
                while i * i <= num {
                    if num % i == 0 {
                        return false;
                    }
                    i += 1;
                }
                true
            }
        };
        let n = nums.len();
        let mut res = 0;
        for i in 0..n {
            if check(nums[i][i]) {
                res = max(res, nums[i][i]);
            }
            if check(nums[i][n - 1 - i]) {
                res = max(res, nums[i][n - 1 - i]);
            }
        }
        res
    }
}
题解 2 - cpp
- 编辑时间:2023-04-09
- 执行用时:268ms
- 内存消耗:69.8MB
- 编程语言:cpp
- 解法介绍:线性筛。
class Solution {
public:
    int diagonalPrime(vector<vector<int>>& nums) {
        int n = nums.size(), res = 0, MAX = 0;
        unordered_set<int> s;
        for (int i = 0; i < n; i++) {
            s.insert(nums[i][i]);
            s.insert(nums[i][n - 1 - i]);
            MAX = max(MAX, nums[i][i]);
            MAX = max(MAX, nums[i][n - 1 - i]);
        }
        MAX++;
        vector<int> primes(MAX, 0);
        for (int i = 2; i < MAX; i++) {
            if (primes[i] == 0) {
                primes[++primes[0]] = i;
                if (s.count(i)) res = max(res, i);
            }
            for (int j = 1; j <= primes[0] && i * primes[j] < MAX; j++) {
                primes[i * primes[j]] = 1;
                if (i % primes[j] == 0) break;
            }
        }
        return res;
    }
};
题解 3 - python
- 编辑时间:2023-04-09
- 执行用时:216ms
- 内存消耗:26.9MB
- 编程语言:python
- 解法介绍:同上。
def check(num: int):
    if num == 1:
        return False
    i = 2
    while i * i <= num:
        if num % i == 0:
            return False
        i += 1
    return True
class Solution:
    def diagonalPrime(self, nums: List[List[int]]) -> int:
        n = len(nums)
        res = 0
        for i in range(n):
            if check(nums[i][i]):
                res = max(res, nums[i][i])
            if check(nums[i][n - 1 - i]):
                res = max(res, nums[i][n - 1 - i])
        return res
题解 4 - cpp
- 编辑时间:2023-04-09
- 执行用时:72ms
- 内存消耗:34.7MB
- 编程语言:cpp
- 解法介绍:枚举。
class Solution {
public:
    bool check(int num) {
        if (num == 1) return false;
        for (int i = 2; i * i <= num; i++) {
            if (num % i == 0) return false;
        }
        return true;
    }
    int diagonalPrime(vector<vector<int>>& nums) {
        int n = nums.size(), res = 0;
        for (int i = 0; i < n; i++) {
            if (check(nums[i][i])) res = max(res, nums[i][i]);
            if (check(nums[i][n - 1 - i])) res = max(res, nums[i][n - 1 - i]);
        }
        return res;
    }
};