子串
560.和为k的子数组
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
子数组是数组中元素的连续非空序列。
unordered_map<int, int> prefixSumCount;
prefixSumCount[0] = 1; // 前缀和为0的情况(起始)
int sum = 0;
int count = 0;
for (int num : nums)
{
sum += num;
// 如果存在前缀和为sum - k的情况,则说明中间子数组和为k
if (prefixSumCount.count(sum - k))
{
count += prefixSumCount[sum - k];
}
// 记录当前前缀和出现次数
prefixSumCount[sum]++;
}
return count;
普通数组
53.最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组是数组中的一个连续部分。
int max_sum = nums[0]; // 记录当前最大子数组和
int current_sum = 0; // 当前子数组和
for (int num : nums)
{
current_sum += num;
if (current_sum > max_sum)
{
max_sum = current_sum;
}
if (current_sum < 0)
{
current_sum = 0; // 如果当前和变成负数,从下一个元素重新开始累加
}
}
return max_sum;
56.合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
if (intervals.empty())
{
return {};
}
// 2. 按照区间的起始位置进行排序
sort(intervals.begin(), intervals.end());
// 3. 合并重叠区间
vector<vector<int>> merged;
merged.push_back(intervals[0]); // 先放入第一个区间
for (int i = 1; i < intervals.size(); ++i)
{
vector<int>& currentInterval = intervals[i];
vector<int>& lastMergedInterval = merged.back();
if (currentInterval[0] <= lastMergedInterval[1])
{
// 当前区间与上一个合并的区间重叠
lastMergedInterval[1] = max(lastMergedInterval[1], currentInterval[1]);
}
else
{
// 当前区间与上一个合并的区间不重叠,直接加入结果
merged.push_back(currentInterval);
}
}
return merged;
189.轮转数组
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
int n = nums.size();
k = k % n;
// 1. 翻转整个数组
reverse(nums.begin(), nums.end());
// 2. 翻转前 k 个元素
reverse(nums.begin(), nums.begin() + k);
// 3. 翻转剩余的 n-k 个元素
reverse(nums.begin() + k, nums.end());
238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请 不要使用除法,且在 O(n) 时间复杂度内完成此题。
int n = nums.size();
vector<int> result(n, 1); // 初始化结果数组
// 1. 计算前缀积
int prefix = 1;
for (int i = 0; i < n; ++i)
{
result[i] = prefix; // 当前位置的结果是之前所有元素的乘积
prefix *= nums[i]; // 更新前缀积
}
// 2. 计算后缀积,并与前缀积相乘
int postfix = 1;
for (int i = n - 1; i >= 0; --i)
{
result[i] *= postfix; // 将后缀积乘到当前位置的结果上
postfix *= nums[i]; // 更新后缀积
}
return result;