[杨小白]_leetcode_力扣_第 324 场周赛-第二题

79 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标2000分,现在1995!!

力扣第 324 场周赛-力扣

第 324 场周赛

掉分啊!!! 打比赛的只有4000来人了

image.png

image.png

image.png

image.png

image.png

2507. 使用质因数之和替换后可以取到的最小值

给你一个正整数 n 。

请你将 n 的值替换为 n 的 质因数 之和,重复这一过程。

注意,如果 n 能够被某个质因数多次整除,则在求和时,应当包含这个质因数同样次数。 返回 n 可以取到的最小值。

示例1:

输入:n = 15

输出:5

解释:最开始,n = 15 。

15 = 3 * 5 ,所以 n 替换为 3 + 5 = 8 。

8 = 2 * 2 * 2 ,所以 n 替换为 2 + 2 + 2 = 6 。

6 = 2 * 3 ,所以 n 替换为 2 + 3 = 5 。

5 是 n 可以取到的最小值。

示例 2:

输入: n = 3

输出: 3

解释: 最开始,n = 3 。

3 是 n 可以取到的最小值。

提示:

  • 2 <= n <= 105

代码

这个题的难度我认为是质数这一块,所以,我先把所有的质数求出来之后,再循环去使用。其他的使用过程就简单了,读题题。 但是这个方法耗时太久

看看方法二

对于n来说,如果n能整除x就让n一直除x,如果不能那就x++,这样n去除的x一定都是质数。 好方法

方法一

class Solution {
    static int[] dp = new int[100010];
    static int index = 1;
    static {
        dp[0] = 2;
        for(int i = 3; i < 100000; i = i +2) {
            if(iszhi(i)) {
                dp[index] = i;
                index++;
            }
        }
    }
    static public boolean iszhi(int t) {
        for(int i = 2; i < t; i++) {
            if(t % i == 0) {
                return false;
            }
        }
        return true;
    }
    public int smallestValue(int n) {
        while(true) {
            int temp = n;
            int num = 0;
            for(int i = 0; dp[i] <= temp;) {
                if(temp % dp[i] == 0) {
                    num += dp[i];
                    temp = temp / dp[i];
                } else {
                    i++;
                }
            }
            if(num == n) {
                return num;
            } else {
                n = num;
            }
        }
    }
}

方法二

class Solution {
    public int smallestValue(int n) {
        if(n == 4) return 4;
        int num = 0;
        int i = 2;
        while(n > 1){
            if(n == i && num == 0) return i;
            if(n % i == 0){
                num += i;
                n /= i;
            }else i++;  
        }
        return smallestValue(num);
    }
}

3.结束

大早上爬起来掉分,第四题太简单了,第三题又一直考虑不充分,有几个过不了,掉分咯~ 今年上2000分有点难度。