2021-10-03

这篇博客介绍了LeetCode第62场双周赛的四道编程题目,包括5874.分割数组的最多方案数、5873.考试的最大困扰度等。解决方案涉及到了二维数组的构建、滑动窗口最大值的求解以及前缀和与哈希表的应用。通过这些题目,可以锻炼和提升对数组操作和动态规划的理解与应用能力。

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

leecode 第 62 场双周赛

传送门

第一题 5874. 分割数组的最多方案数

class Solution {
public:
    vector<vector<int>> construct2DArray(vector<int>& original, int m, int n) {
        int len=original.size();
        vector<vector<int>>res(m,vector<int>(n,0));
        if(m*n!=len)
        {
           return {};
        }
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                res[i][j]=original[n*i+j];
            }
        }
        return res;
    }
};

知识点

vector二维数组的定义。
vector<vector>res(m,vector(n,0))
使用:同数组方法。

第三题 5873. 考试的最大困扰度


class Solution {
public:
    int maxConsecutiveAnswers(string answerKey, int k) {
        int len=answerKey.size();
        if(len==0) return 0;
        int l=0,r=0;//滑动窗口[l,r]
        int ans=1;//初始化最大长度为1,当前窗口内有一个元素
        int tnum=0,fnum=0;
        if(answerKey[l]=='T') tnum++;
        else fnum++;
        while(r<len)
        {
            if(tnum>k && fnum>k)//窗口内T/F数量超过可替换数量,则左窗口右移
            {
                if(answerKey[l]=='T') tnum--;
                else fnum--;
                l++;
            }
            else //否则,更新最大窗口值,右窗口向右扩大
            {
                ans=max(ans,(r-l+1));
                r++;
                if(answerKey[r]=='T') tnum++;
                else fnum++;
            }
        }
        return ans;
    }
};

第四题 5874. 分割数组的最多方案数
知识点:前缀和+两个哈希表维护

typedef long long LL;
const int maxn=1e5+100;
class Solution {
        LL sum[maxn];
        unordered_map<LL,LL>mapR,mapL;
public:
    int waysToPartition(vector<int>& num, int k) {
        LL tot=0;LL ans=0;LL n=num.size();
        for(int i=0;i<n;i++){
            tot+=num[i];
            if(i==0) sum[i]=num[i];
            else sum[i]=sum[i-1]+num[i];
            if( i+1<n ) mapR[tot]++;
        }
        ///不修改
        if(tot%2==0) ans=max(ans,mapR[tot/2]);
        ///修改
        for(int i=0;i<n;i++){
            LL d=k-num[i];
            if( (tot+d)%2==0){
                ans=max(ans,mapL[(tot+d)/2]+mapR[(tot-d)/2]);
            }
            mapL[sum[i]]++;
            mapR[sum[i]]--;
        }
        return ans;
    }
};

模拟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值