前言
第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/