leetcode第271周周赛

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

周赛是越来越简单了吗

唯一一次四题都有思路,但是没有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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值