【刷爆LeetCode】五月算法集训(8)前缀和

本文介绍了四个算法问题的解题思路和C++代码实现,包括一维数组的动态和、所有奇数长度子数组的和、形成两个异或相等数组的三元组数目以及拼车问题。通过每日算法练习,提升编程能力。

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

前言

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


一、1480.一维数组的动态和(简单)

1.题目描述

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

2.解题思路

由题意可知,在返回的数组当中,第一个元素的值为原数组的第一个数的值,第二个元素的值为原数组的前两个数的和,第三个元素的值为原数组的前三个数的和,以此类推。因此,我们进行双层遍历来求解。

3.代码演示(C++)

class Solution 
{
public:
    vector<int> runningSum(vector<int>& nums) 
    {
        int n=nums.size();
        vector<int>ans(n);
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<=i;j++)
            {
                ans[i]+=nums[j];
            }
        }
        return ans;
    }
};

4.题目链接

题目传送门


二、1588.所有奇数长度子数组的和(简单)

1.题目描述

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

2.解题思路

两个相邻的奇数的间隔为2,我们从长度为1开始遍历整个数组,起始下标为0,终止
下标为数组长度或数组长度-1,最后将符合条件的元素累加在一起返回结果。

3.代码演示(C++)

class Solution 
{
public:
    int sumOddLengthSubarrays(vector<int>& arr) 
    {
        int sum=0;
        int n=arr.size();
        for(int start=0;start<n;start++)
        {
            for(int length=1;length+start<=n;length+=2)
            {
                int end=start+length-1;
                for(int i=start;i<=end;i++)
                {
                    sum+=arr[i];
                }
            }
        }
        return sum;
    }
};

4.题目链接

题目传送门


三、1442.形成两个异或相等数组的三元组数目(中等)

1.题目描述

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

2.解题思路

主要还是公式的推导。第(i+1)个异或的结果为前i个异或的结果再异或上第i个数,
之后用三层循环来判断两个结果是否相等。

3.代码演示(C++)

class Solution 
{
public:
    int countTriplets(vector<int>& arr) 
    {
        int ans=0;
        int n=arr.size();
        vector<int>nums(n+1);
        for(int i=0;i<n;i++)
        {
            nums[i+1]=nums[i]^arr[i];
        }
        for(int i=0;i<arr.size();i++)
        {
            for(int j=i+1;j<arr.size();j++)
            {
               
                for(int k=j;k<arr.size();k++)
                {
                    if(nums[i]==nums[k+1])
                    {
                        ans++;
                    }
                }
            }
        }
        return ans;

    }
};

4.题目链接

题目传送门


四、1094.拼车(中等)

1.题目描述

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

2.解题思路

代码来源于LeetCode官方题解,后续仍需加强理解与学习。

3.代码演示(C++)

class Solution
 {
public:
    bool carPooling(vector<vector<int>>& trips, int capacity) 
    {
        vector<int> d(1002);
        for(auto &e: trips) 
        {
            d[e[1]] += e[0];
            d[e[2]] -= e[0];
        }
        for(int i = 0; i <= 1000; i ++ ) 
        {
            if(i) d[i] += d[i - 1];
            if(d[i] > capacity) return false;
        }
        return true;
    }
};

4.题目链接

题目传送门


总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值