开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情
前言
小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标2000分,现在1995!!
力扣第 324 场周赛-力扣
第 324 场周赛
掉分啊!!! 打比赛的只有4000来人了
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分有点难度。