【五月集训】Day08——前缀和


前言

        第8天:前缀和
        个人理解公式S[i] = S[i-1]+nums[i]反映了前缀和的主要思想,后两道题由于时间问题来不及做了,看了两个不错的解题思路,先码下来了,改天补上。


一、练习题目

题目链接难度
1480. 一维数组的动态和★☆☆☆☆
1588. 所有奇数长度子数组的和★☆☆☆☆
1442. 形成两个异或相等数组的三元组数目★★☆☆☆
1094. 拼车★★☆☆☆

二、思路与代码

1. 一维数组的动态和

        题目描述:
        给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。请返回 nums 的动态和。

class Solution(object):
    def runningSum(self, nums):
        for i in range(1, len(nums)):
            nums[i] += nums[i-1]
        return nums

2. 所有奇数长度子数组的和

        题目描述:
        给你一个正整数数组 arr ,请你计算所有可能的奇数长度子数组的和。子数组 定义为原数组中的一个连续子序列。请你返回 arr 中 所有奇数长度子数组的和 。

class Solution(object):
    def sumOddLengthSubarrays(self, arr):
        ans = 0
        for i in range(1, len(arr)):
            arr[i] += arr[i-1]
        for i in range(1, len(arr)+1, 2):
            for j in range(i-1, len(arr)):
                if j - i == -1:
                    pre = 0
                else:
                    pre = arr[j-i]
                ans += (arr[j] - pre)
        return ans

3. 形成两个异或相等数组的三元组数目

        题目描述:在这里插入图片描述示例

解题思路:
作者:Xiaohu9527
链接:https://leetcode-cn.com/problems/count-triplets-that-can-form-two-arrays-of-equal-xor/solution/xin-shou-pian-qian-ru-shen-chu-xi-lie-1-cnk37/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

class Solution {
public:
    int countTriplets(vector<int>& arr) {
        int n = arr.size(), ans = 0, val = 0;
        unordered_map<int, int> cnt, tot;
        for(int k = 0; k < n; ++k)
        {
            val ^= arr[k];
            ans += cnt[val]*k - tot[val];

            //这里不能把 arr[i]包含进去,因为我们需要的是arr[i]前面一项的异或值
            //想想法三中的 preXor[i-1] == preXor[k]
            ++cnt[val^arr[k]];
            tot[val^arr[k]] += k;
        }
        return ans;
    }
};


4. 拼车

        题目描述:
在这里插入图片描述
示例

解题思路:
作者:fengxu_w
链接:https://leetcode-cn.com/problems/car-pooling/solution/1094-pin-che-python-chai-fen-shu-zu-by-f-yvh7/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

class Solution:
    def carPooling(self, trips: List[List[int]], capacity: int) -> bool:
        # 确定最多有几站->数组长度
        stations = 0
        for change_list in trips:
            if change_list[2]+1 > stations:
                stations = change_list[2] + 1
        # 原数组,不接客时每站人数
        ori = [0] * stations 
        # 核心步骤1. 构造差分数组
        diff = [0] * stations
        # 核心步骤2. 差分数组记录修改
        for cnt, start, end in trips:
            diff[start] += cnt
            # diff下标为区间终点+1,因为修改区间为[start, end-1],所以diff下表为end
            if end < stations:
                diff[end] -= cnt
        # 核心步骤3. 差分数组推出修改后的数组
        res = [diff[0]]
        for i in range(1, stations):
            res.append(res[i-1] + diff[i])
        # 判断修改后的数组中是否有超载的
        for cap in res:
            if cap > capacity:
                return False
        return True

参考资料
[1]https://leetcode-cn.com/problems/count-triplets-that-can-form-two-arrays-of-equal-xor/solution/xin-shou-pian-qian-ru-shen-chu-xi-lie-1-cnk37/
[2]https://leetcode-cn.com/problems/car-pooling/solution/1094-pin-che-python-chai-fen-shu-zu-by-f-yvh7/

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值