LeetCode周赛-152

本文总结了LeetCode周赛152的两道题解,包括质数排列和健身评估。质数排列题中,作者分享了对大数取模问题的解决技巧,强调每次相乘后都要进行取模操作;健身评估题则提醒读者在面对累加问题时,应选择更高效的方法避免超时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LeetCode周赛152做题整理

做题时间:2019年9月3日

1 质数排列[⭐⭐]

这道题乍一看很简单,数据范围也很小,因此直接使用暴力法,首先找到n以内的质数的个数c,再分别将c和n-c的阶乘相乘即可:

#include <cmath>

...
return jc(c) * jc(n-c) % (pow(10, 9) + 7)

但是这样得不到正确答案,在学习了其他人的答案之后,我发现:这种需要对大数取模的问题需要在每一次相乘后都进行取模操作才能得到正确解,这一点要牢记了!具体见下面的代码。

class Solution {
public:
    bool checkIsPrime(int k) {
        int flag = true;
        for (int j = 2; j < k; j++) {
            if(k % j == 0) {
                flag = false;
                break;
            }
        }
        return flag;    
    }
    
    int numPrimeArrangements(int n) {
        long ans = 1, c = 0, nc = 0;
        for(int i = 1; i < n; i++) {
            if(checkIsPrime(i + 1)) c++;
        }
        nc = n - c;
        cout << c;
        for(int i = 1; i <= c; i++) {
            ans *= i;
            ans %= 1000000007;
        }
        for(int i = 1; i <= nc; i++) {
            ans *= i;
            ans %= 1000000007;
        }
        return int(ans);
    }
};

2 健身评估[⭐⭐]

这道题题意简单明了,思路也很清晰。然而,我使用的是笨方法,我用了两重循环,时间复杂度O(n*k),直接超时。因此这类题目需要使用累加的方法,能够在O(n)的时间复杂度内完成任务!

同时,在下面的代码中使用了vector的resize()方法,该方法能够指定vector的大小并且赋初始值,十分实用!

class Solution {
public:
    int dietPlanPerformance(vector<int>& calories, int k, int lower, int upper) {
        vector<int> sum;
        int n = calories.size(), ans = 0;
        sum.resize(n + 1, 0);
        for(int i = 0; i < n; i++) {
            sum[i + 1] = sum[i] + calories[i];
        }
        
        for(int i = 0; i < n - k + 1; i++) {
            if (sum[i + k] - sum[i] > upper) ans++;
            if (sum[i + k] - sum[i] < lower) ans--;
        }
        return ans;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值