力扣热题100题解(c++)—子串、普通数组(不包含困难)
子串
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的情况,则说明中间子数组和为kif (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;