LeetCode第330场周赛

本文解析了LeetCode第330场周赛的四道题目:统计桌面上的不同数字、猴子碰撞的方法数、将珠子放入背包中及统计上升四元组。通过代码实现展示了算法思想。

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

2023.1.29LeetCode第330场周赛

2549. 统计桌面上的不同数字

思路

题意是找出集合中相除余数为1的数,并加入集合,直至不能更新,求集合中数的数量
给定数nn - 1 != 1时,与n - 1相除余数为1,故[2, n]中的所有数都会被加入集合,数量为n - 1n = 1时特判

代码

class Solution {
public:
    int distinctIntegers(int n) {
        if (n == 1) return 1;
        return n - 1;
    }
};

2550. 猴子碰撞的方法数

思路

快速幂
只有当所有猴子同方向时不会碰撞,方法数为 2 n − 2 2^n - 2 2n2

代码

class Solution {
public:
    typedef long long ll;

    ll qmi(ll a, ll b, ll mod) {
        ll res = 1;
        while (b) {
            if (b & 1) res = res * a % mod;
            a = a * a % mod;
            b >>= 1;
        }
        return res;
    }

    int monkeyMove(int n) {
        ll mod = 1e9 + 7;
        return (qmi(2, n, mod) + mod - 2) % mod;
    }
};

2551. 将珠子放入背包中

思路

题意是将数组分为k段,即选择k - 1个分界线,每个分界线在计算时是相邻两个元素之和,第一个元素和最后一个元素每种方案都会选到,将所有的相邻两个元素和计算出来,求最大的k - 1和最小的k - 1个数之和的差为答案

代码

class Solution {
public:
    typedef long long ll;
    
    long long putMarbles(vector<int>& w, int k) {
        int n = w.size();
        if (n == 1) return 0;
        vector<ll> a;
        for (int i = 0; i < n - 1; i ++ )
            a.push_back(w[i] + w[i + 1]);
        sort(a.begin(), a.end());
        ll t1 = 0, t2 = 0;
        // 最大的k - 1个数
        for (int i = a.size() - 1; i >= a.size() - k + 1 && i >= 0; i -- )
            t1 += a[i];
        // 最小的k - 1个数
        for (int i = 0; i < k - 1 && i < a.size(); i ++ )
            t2 += a[i];
        return t1 - t2;
    }
};

2552. 统计上升四元组

思路

i < j < k < l i<j<k<l i<j<k<l,同时, n u m s [ i ] < n u m s [ k ] < n u m s [ j ] < n u m s [ l ] nums[i] < nums[k] < nums[j] < nums[l] nums[i]<nums[k]<nums[j]<nums[l]
数组范围允许使用双循环,枚举所有的jk,当nums[j] > nums[k]时,需要找到j左边小于nums[k]的数的数量和k右边大于nums[j]的数的数量,根据乘法原理求出答案,由于nums数组是一个排列,可以运用前缀和先预处理出目标数组lr来表示数量

代码

class Solution {
public:
    typedef long long ll;
    
    long long countQuadruplets(vector<int>& a) {
        int n = a.size();
        const int N = 4010;
        vector<vector<int>> l, r;
        l.resize(n, vector<int>(N));
        r.resize(n, vector<int>(N));
        for (int i = 0; i < n; i ++ ) {
            if (i)
                l[i] = l[i - 1];
            for (int j = a[i] + 1; j < N; j ++ )
                l[i][j] ++ ;
        }
        for (int i = n - 1; i >= 0; i -- ) {
            if (i < n - 1)
                r[i] = r[i + 1];
            for (int j = a[i] - 1; j >= 0; j -- )
                r[i][j] ++ ;
        }
        ll ans = 0;
        for (int i = 1; i < n; i ++ )
            for (int j = i + 1; j < n - 1; j ++ ) {
                if (a[i] > a[j]) {
                    ans += l[i - 1][a[j]] * r[j + 1][a[i]];
                }
            }
        return ans;
    }
};
### LeetCode周赛概述 LeetCode周赛是一项在线编程竞赛活动,旨在帮助程序员提升算法能力并准备技术面试。参与者可以在规定的时间内解决一系列具有挑战性的编程问题[^1]。 ### 参加方法 为了参与LeetCode周赛,用户需先注册一个LeetCode账号,并定期关注官方公告获取最新的赛事通知。比赛通常会在周末举行,在比赛当天登录网站进入指定的比赛页面即可开始作答。对于初次参赛者来说,可能会遇到一些操作上的不熟悉,比如不清楚在哪里提交解答等问题,但随着经验积累这些问题都会迎刃而解[^2]。 ### 比赛时间安排 LeetCode周赛一般固定在北京时间每周日凌晨01:00(UTC/GMT+8)准时开赛,持续时间为两小时。在此期间,选手可以自由选择任意连续的两个小时完成比赛中的题目。需要注意的是,具体的比赛日期和时间可能因节假日等因素有所调整,请务必留意官网发布的最新消息[^4]。 ### 题目类型分析 比赛中涉及的题目种类繁多,涵盖了数据结构、算法设计等多个方面。常见的题目形式包括但不限于: - 数组与字符串处理 - 动态规划 - 图论及其应用 - 排序与查找技巧 - 栈队列等高级数据结构的应用 这些题目往往要求较高的逻辑思维能力和扎实的基础知识掌握程度。例如,在某些情况下,一道看似简单的数组运算题也可能隐藏着深层次的数据结构优化思路;而在另一些景下,则需要运用到复杂的动态规划策略来解决问题[^5]。 ```python def example_function(input_data): """ 这是一个示例函数,用于展示如何编写Python代码。 参数: input_data (list): 输入的数据列表 返回: result (int): 计算后的结果值 """ # 处理输入数据... processed_data = sorted(input_data) # 执行核心计算逻辑... result = sum(processed_data[:3]) return result ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值