【刷爆LeetCode】七月算法集训(6)滑动窗口

题目来源于知识星球—英雄算法联盟,七月算法集训专题

前言

跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!


一、643.子数组最大平均数I (简单)

1.题目描述

https://img-blog.csdnimg.cn/9228089a7fce408c9bef9d20774f271b.jpeg =500x

2.解题思路

代码来源于官方题解。将每个长度为K的子数组分别求和再计算平均值会使复杂度
过高,无法通过。

3.代码演示(C++)

class Solution 
{
public:
    double findMaxAverage(vector<int>& nums, int k) 
    {
        int sum = 0;
        int n = nums.size();
        for (int i = 0; i < k; i++) 
        {
            sum += nums[i];
        }
        int maxSum = sum;
        for (int i = k; i < n; i++) 
        {
            sum = sum - nums[i - k] + nums[i];
            maxSum = max(maxSum, sum);
        }
        return static_cast<double>(maxSum) / k;
    }
};

4.题目链接

题目传送门


二、718.最长重复子数组(中等)

1.题目描述

https://img-blog.csdnimg.cn/2d4646142b14485bbfd589dec0946081.jpeg =500x

2.解题思路

利用dp[i][j]表示以nums1[i]和nums2[j]结尾的最长公共子串的长度。
然后根据nums1[i]和nums2[j]的实际情况以及dp[i-1][j-1]的值递推。

3.代码演示(C++)

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;
    }
};

4.题目链接

题目传送门


三、978.最长湍流子数组(中等)

1.题目描述

https://img-blog.csdnimg.cn/43544a780b9f4ca1b4642362deeb23da.jpeg =500x

2.解题思路

按照题意分步骤判断即可。

3.代码演示(C++)

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;
    }
};

4.题目链接

题目传送门


四、1052.爱生气的书店老板(中等)

1.题目描述

https://img-blog.csdnimg.cn/173198a222ce48e0aa327999697ed022.jpeg =500x

2.解题思路

这道题以前好像做过

3.代码演示(C++)

class Solution 
{
public:
    int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int minutes) 
    {
        int total = 0;
        int n = customers.size();
        for (int i = 0; i < n; i++) {
            if (grumpy[i] == 0) {
                total += customers[i];
            }
        }
        int increase = 0;
        for (int i = 0; i < minutes; i++) {
            increase += customers[i] * grumpy[i];
        }
        int maxIncrease = increase;
        for (int i = minutes; i < n; i++) {
            increase = increase - customers[i - minutes] * grumpy[i - minutes] + customers[i] * grumpy[i];
            maxIncrease = max(maxIncrease, increase);
        }
        return total + maxIncrease;

    }
};

4.题目链接

题目传送门


总结

每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值