当前位置: 首页 > news >正文

力扣热题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;

相关文章:

  • Matlab 复合多层结构的隔声研究
  • 手搓箱图并输出异常值(MATLAB)
  • 海量数据笔试题--Top K 高频词汇统计
  • [MERN 项目实战] MERN Multi-Vendor 电商平台开发笔记(v2.0 从 bug 到结构优化的工程记录)
  • RabbitMQ 中的队列声明
  • 循环神经网络RNN(示例代码LSTM预测股价示例)
  • 2025年3月AGI技术月评|技术突破重构数字世界底层逻辑
  • 旋转磁体产生的场-对导航姿态的影响
  • 算法时代的“摩西十诫”:AI治理平台重构数字戒律
  • HTML字符实体和转义字符串
  • 某城乡老旧房屋试点自动化监测服务项目
  • Uniapp-小程序从入门到精通
  • gitlab-ce容器镜像源(国内)
  • 【霍夫变换】图像处理(OpenCV)-part11
  • 【修复】Django收到请求报Json解析错误
  • R语言中的常用内置函数
  • 汽车自动驾驶介绍
  • Java查询数据库表信息导出Word
  • 【重走C++学习之路】18、map和set
  • UEC++第10天|UEC++获取对象、RTTI是C++
  • 专访|白俄罗斯共产党中央第一书记瑟兰科夫:只有大家联合起来,才能有效应对当前危机所带来的冲击
  • 讲座预告|大国博弈与创新破局:如何激励中国企业创新
  • AI翻译技术已走向大规模商用,应用场景覆盖多个关键领域
  • 上海车展上的双向奔赴:跨国车企融入中国创新,联手“在中国,为全球”
  • 聚焦“共赢蓝色未来” “海洋命运共同体”上海论坛举行
  • 专家解读上海一季度经济数据:经济韧性在增强,民企活力不可小觑