题目链接: Leetcode Weekly Contest 252
写在前面:
本次周赛做出第一题和第三题。
1、1952. Three Divisors
难度:Easy
题目大意:
判断一个正整数是否刚好有3个因子。
思路:
n
的范围较小,统计其因子的数量即可。
class Solution {
public boolean isThree(int n) {
int count=0;
for(int i=1;i<=n;i++){
if(n%i==0){
count++;
}
}
return count==3;
}
}
2、1953. Maximum Number of Weeks for Which You Can Work
难度:Medium
题目大意:
详见题意。
思路:
贪心算法,计算出数组的元素之和 s u m sum sum和最大值 m a x max max,如果 s u m − m a x ≥ m a x sum-max \geq max sum−max≥max,则可以完成所有任务,否则只能完成 2 ∗ ( s u m − m a x ) + 1 2*(sum-max)+1 2∗(sum−max)+1个任务。
代码
class Solution {
public long numberOfWeeks(int[] milestones) {
if(milestones.length==1){
return 1;
}
long sum=0;
int max=milestones[0];
for(int n:milestones){
sum+=n;
if(n>max){
max=n;
}
}
if(max>sum-max){
sum=2*(sum-max)+1;
}
return sum;
}
}
3、1954. Minimum Garden Perimeter to Collect Enough Apples
难度:Medium
题目大意:
详见题意。
思路:
找规律,推导数学公式。参考高赞回答。
代码
class Solution {
public long minimumPerimeter(long neededApples) {
long total=0;
long i=0;
while(true){
i++;
total=2*i*(i+1)*(2*i+1);
if(total>=neededApples){
break;
}
}
return 2*i*4;
}
}
4、1955. Count Number of Special Subsequences
难度:Hard
题目大意:
详见题目。
思路
动态规划。参考高赞回答。
代码
class Solution {
public int countSpecialSubsequences(int[] nums) {
int[] dp=new int[3];
//dp[0]表示特殊子序列0的数目
//dp[1]表示特殊子序列0,1的数目
//dp[2]表示特殊子序列0,1,2的数目
int mod=1000000007;
for(int n:nums){
if(n==0){
dp[0]=( (dp[0]%mod)+(dp[0]+1)%mod )%mod;//一个0可以单独成为特殊子序列
//注意在加法过程中就取模,否则会溢出
}
else if(n==1){
dp[1]=( dp[1]%mod+(dp[0]+dp[1])%mod )%mod;
}
else{
dp[2]=( dp[2]%mod+(dp[1]+dp[2])%mod )%mod;
}
}
return dp[2];
}
}