leetcode第271周周赛

本文详细介绍了四道算法题目,包括环和杆问题、子数组范围和计算、解决给植物浇水问题的双指针法以及摘水果的动态规划策略。每道题目的解法都通过C++实现,并分享了思考过程与解题技巧,旨在提升读者的算法能力与AC率。

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

周赛是越来越简单了吗

唯一一次四题都有思路,但是没有AC。。。


第一题:5952 环和杆

class Solution {
public:
    int countPoints(string rings) {
        map<char,set<char>>mp;
        for(int i = 0; i < rings.size(); i++)
        {
            mp[rings[i+1]].insert(rings[i]);
        }
        int ans = 0;
        for(int i = 0; i < 10; i++)
        {
            if(mp['0' + i].size() != 0)
            {
                ans += mp['0' + i].size() == 3 ? 1 : 0;
            }
        }
        return ans;
    }
};

第二题:5953 子数组范围和

class Solution {
public:
    long long subArrayRanges(vector<int>& nums) {
        //sort(nums.begin(), nums.end());
        long long ans = 0;
        for(int i = 0; i < nums.size(); i++)
        {
            int ma = nums[i], mi = nums[i];
            for(int j = i + 1; j < nums.size(); j++)
            {
                ma = max(ma, nums[j]);
                mi = min(mi, nums[j]);
                ans += ma-mi;
            }
        }
        return ans;
    }
};

第三题:5954 给植物浇水 二

class Solution {
public:
    int minimumRefill(vector<int>& p, int capacityA, int capacityB) {
        int ans = 0;
        int n = p.size();
        int ca = capacityA,cb = capacityB;
        int l = 0, r = n-1;
        //int b = n%2 == 0 ? n/2+1 : n/2;
        for(int i = 0; i < n/2; i++,l++){
            if(ca >= p[l]){ca-=p[l];}
            else{
                int c = (p[l] % capacityA == 0 ? p[l] / capacityA : p[l] / capacityA + 1);
                ans += c;
                ca = capacityA*c - p[l];
            }
        }
        for(int i = 0; i < n/2; i++,r--){
            if(cb >= p[r]){cb-=p[r];}
            else{
                int c = (p[r] % capacityB == 0 ? p[r] / capacityB : p[r] / capacityB + 1);
                ans += c;
                cb = capacityB*c - p[r];
                
            }
        }
        if(n%2){
            if(ca >= cb){
                if(ca < p[n/2])ans += (p[n/2] % capacityA == 0 ? p[n/2] / capacityA : p[n/2] / capacityA + 1);
            }
            else {
                if(cb < p[n/2])ans += (p[n/2] % capacityB == 0 ? p[n/2] / capacityB : p[n/2] / capacityB + 1);
            }
        }
        return ans;
    }
};

第四题:5955摘水果(参考坑神的代码才写出来)

class Solution {
public:
    int sum[200007]={0};
    int ma = 0;
    int get(int l, int r)
    {
        int right = 0,left = 0;
        if(l > ma)return 0;
        if(r < 0)return 0;
        if(r > ma)r = ma;
        right = sum[r]; left = 0;
        if(l - 1 >= 0) left = sum[l-1];
        return right - left;
    }
    int maxTotalFruits(vector<vector<int>>& fruits, int startPos, int k) {
        int n = fruits.size();
        int ans = 0;
        for(int i = 0; i < n; i++)ma = max(ma,fruits[i][0]);
        for(int i = 0; i < ma; i++)sum[i] = 0;
        for(int i = 0; i < n; i++)sum[fruits[i][0]] += fruits[i][1];
        for(int i = 1; i <= ma; i++)sum[i] = sum[i] + sum[i-1];
        ans = max(get(startPos-k, startPos),get(startPos, startPos+k));//往左走和往右走的最大值
        for(int i = 0; i + i <= k; i++)
        {
            ans = max(ans, get(startPos-i, startPos+k-i-i));
            ans = max(ans, get(startPos-(k-i-i), startPos+i));
        }
        return ans;
    }
};

希望下次能AC

### 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、付费专栏及课程。

余额充值