【今日作业】《七月集训》(第06天)——滑动窗口

七月第六天解题报告

本文实现了超链接跳转,查询题目可直接点击题号跳转LeetCode

目录

643. 子数组最大平均数 I
718. 最长重复子数组
978. 最长湍流子数组
1052. 爱生气的书店老板

题目

643. 子数组最大平均数 I

代码演示
class Solution {
public:
    double findMaxAverage(vector<int>& nums, int k) {
        int l = 0, r = -1;
        int sum = 0;
        int maxval = -10000000001;
        while(r < (int)nums.size() - 1){
            ++r;
            sum += nums[r];
            while(r - l + 1 > k){
                sum -= nums[l];
                ++l;
            }
            if(r - l + 1 == k){
                maxval = max(maxval, sum);
            }
        }
        return maxval * 1.0 / k;
    }
};

718. 最长重复子数组

代码演示
class Solution {
    int dp[1010][1010];
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        int n = nums1.size();
        int m = nums2.size();
        int maxv = 0;
        for(int i = 0; i < n; ++i){
            for(int j = 0; j < m; ++j){
                if(!i || !j){
                    dp[i][j] = (nums1[i] == nums2[j]) ? 1 : 0;
                }else{
                    dp[i][j] = (nums1[i] == nums2[j]) ? dp[i-1][j-1] + 1 : 0;
                }
                maxv = max(maxv, dp[i][j]);
            }
        }
        return maxv;
    }
};

978. 最长湍流子数组

代码演示
class Solution {
public:
    int maxTurbulenceSize(vector<int>& arr) {
        int ans = 0;
        int aec[40010], des[40010];
        for(int i = 0; i < arr.size(); ++i){
            aec[i] = des[i] = 1;
            if(i){
                if(arr[i] > arr[i-1]){
                    aec[i] = des[i-1]+1;
                }
                if(arr[i] < arr[i-1]){
                    des[i] = aec[i-1]+1;
                }
            }
            ans = max(ans, max(aec[i], des[i]));
        }
        return ans;
    }
};

1052. 爱生气的书店老板

代码演示
class Solution {
public:
    int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int minutes) {
        vector<int>preSum(customers.size());
        int add=0,maxi=0,ans=0;
        add=grumpy[0]?0:customers[0];
        preSum[0]=add;
        for(int i=1;i<customers.size();i++){
            add=grumpy[i]?0:customers[i];
            preSum[i]=preSum[i-1]+add;
        }
        int i=0,j=0;
        for(int j=0;j<customers.size();j++){
            if(j-i+1>minutes){
                i++;
            }
            if(j-i+1==minutes){
                maxi=preSum[customers.size()-1];
                for(int m=i;m<=j;m++){
                    if(grumpy[m]==1)maxi+=customers[m];
                }
                ans=max(maxi,ans);
            }
        }
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小熊猫写算法er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值