C语言/数据结构算法题解:环形数组最大连续子段和——单调队列+前缀和O(n)解法
问题描述小明在玩一个环形数字游戏游戏规则是给定一个环形整数数组即首尾相连的数组每个元素代表一个位置上的“贡献值”。小明可以自由选择一段连续的位置由于是环形选择可以跨越数组首尾但被选中的位置总数不能超过数组长度的一半。小明想要最大化所选位置的贡献值之和。需要注意的是由于是环形数组当选择跨越首尾时实际选中的是数组末尾的一部分和开头的一部分组成的连续段。例如数组为 [1,2,3,4,5] 且允许选择3个位置那么一种可能的选择是 [5,1,2]即索引4,0,1。你的任务是帮助小明设计一个算法在 O(n) 时间复杂度内找到这个最大贡献值。测试样例样例1输入nums [1,2,3,4,5], k 3输出12解释允许选择3个位置最大和为34512选择索引2,3,4。其他选择如索引3,4,045110或索引4,0,15128或索引0,1,21236均小于12。样例2输入nums [8,2,3,4,5,6], k 3输出19解释最大和为56819选择索引4,5,0。其他选择如索引0,1,282313或索引1,2,32349或索引2,3,434512或索引3,4,545615均小于19。样例3输入nums [10,20,30,40], k 2输出70解释最大和为304070选择索引2,3。其他选择如索引0,1102030或索引1,2203050或索引3,0401050均小于70。约束条件1 nums.length 10^5-10^4 nums[i] 10^41 k floor(nums.length / 2) 即k不超过数组长度的一半数组是环形的索引0和n-1相邻程序代码#include stdio.h#include stdlib.h#include limits.hint maxContrib(int* nums, int numsSize, int k) {int n numsSize;// 构建双倍数组int* doubled (int*)malloc(2 * n * sizeof(int));for (int i 0; i 2 * n; i) {doubled[i] nums[i % n];}// 前缀和int* prefix (int*)malloc((2 * n 1) * sizeof(int));prefix[0] 0;for (int i 0; i 2 * n; i) {prefix[i 1] prefix[i] doubled[i];}// 单调队列维护前缀和的最小值索引int* deque (int*)malloc((2 * n 1) * sizeof(int));int head 0, tail 0;int ans INT_MIN;// 遍历右端点for (int i 1; i 2 * n; i) {// 移除超出窗口的索引while (head tail deque[head] i - k) {head;}// 如果队列不为空计算以 i-1 结尾的最大和if (head tail) {int sum prefix[i] - prefix[deque[head]];if (sum ans) ans sum;}// 维护单调递增队列while (head tail prefix[deque[tail - 1]] prefix[i]) {tail--;}deque[tail] i;}free(doubled);free(prefix);free(deque);return ans;}int main() {int nums1[] {1,2,3,4,5};printf(%d\n, maxContrib(nums1, 5, 3)); // 应输出12int nums2[] {8,2,3,4,5,6};printf(%d\n, maxContrib(nums2, 6, 3)); // 应输出19int nums3[] {10,20,30,40};printf(%d\n, maxContrib(nums3, 4, 2)); // 应输出70return 0;}#include stdio.h #include stdlib.h #include limits.h int maxContrib(int* nums, int numsSize, int k) { int n numsSize; // 构建双倍数组 int* doubled (int*)malloc(2 * n * sizeof(int)); for (int i 0; i 2 * n; i) { doubled[i] nums[i % n]; } // 前缀和 int* prefix (int*)malloc((2 * n 1) * sizeof(int)); prefix[0] 0; for (int i 0; i 2 * n; i) { prefix[i 1] prefix[i] doubled[i]; } // 单调队列维护前缀和的最小值索引 int* deque (int*)malloc((2 * n 1) * sizeof(int)); int head 0, tail 0; int ans INT_MIN; // 遍历右端点 for (int i 1; i 2 * n; i) { // 移除超出窗口的索引 while (head tail deque[head] i - k) { head; } // 如果队列不为空计算以 i-1 结尾的最大和 if (head tail) { int sum prefix[i] - prefix[deque[head]]; if (sum ans) ans sum; } // 维护单调递增队列 while (head tail prefix[deque[tail - 1]] prefix[i]) { tail--; } deque[tail] i; } free(doubled); free(prefix); free(deque); return ans; } int main() { int nums1[] {1,2,3,4,5}; printf(%d\n, maxContrib(nums1, 5, 3)); // 应输出12 int nums2[] {8,2,3,4,5,6}; printf(%d\n, maxContrib(nums2, 6, 3)); // 应输出19 int nums3[] {10,20,30,40}; printf(%d\n, maxContrib(nums3, 4, 2)); // 应输出70 return 0; }运行结果

相关新闻

剪映专业版教程:制作特效与转场质感大片

剪映专业版教程:制作特效与转场质感大片

前言 今天教大家一个特效与转场质感大片的制作方法。这种效果通过歌词同步卡拉OK、多段视频拼接、多种转场和特效叠加,营造出电影级的视觉质感。 效果预览:歌词以双色卡拉OK方式同步显示,四段美女视频依次切换,多种模糊转场过渡…

2026/10/12 22:52:30 阅读更多 →
黑苹果没声音?Hackintool 音频补丁保姆级三步修复指南

黑苹果没声音?Hackintool 音频补丁保姆级三步修复指南

黑苹果没声音?Hackintool 音频补丁保姆级三步修复指南 【免费下载链接】Hackintool The Swiss army knife of vanilla Hackintoshing 项目地址: https://gitcode.com/gh_mirrors/ha/Hackintool 周五晚上,你终于把黑苹果从旧系统升到 Ventura。桌面…

2026/10/12 13:32:21 阅读更多 →
tumblr.js高级技巧:媒体文件上传与NPF格式文章创建指南

tumblr.js高级技巧:媒体文件上传与NPF格式文章创建指南

tumblr.js高级技巧:媒体文件上传与NPF格式文章创建指南 【免费下载链接】tumblr.js JavaScript client for the Tumblr API 项目地址: https://gitcode.com/gh_mirrors/tu/tumblr.js tumblr.js是一款强大的JavaScript客户端,专为Tumblr API设计&a…

2026/10/5 12:07:21 阅读更多 →

最新新闻

ArcMap发布地图到ArcGIS Online:桌面GIS与云GIS协同实战指南

ArcMap发布地图到ArcGIS Online:桌面GIS与云GIS协同实战指南

手头有一张用 ArcMap 配了半天的专题图,领导突然提了一句“网页上能不能打开看看”。以前遇到这种情况,要么导出图片发过去,要么把工程文件拷给同事,但对方电脑上不一定装了 ArcMap,更别说打开后符号字体全乱。后来我把…

2026/10/13 18:18:11 阅读更多 →
AI代码生成视频的五步工程化流水线

AI代码生成视频的五步工程化流水线

1. 项目概述:别被“AI生成视频”带偏了节奏最近刷到不少标题党内容,说什么“Claude Opus 5.5 支持原生视频生成”“大模型终于能直接吐出MP4了”,点进去一看,要么是概念混淆,要么是把代码执行结果当成了视频生成。我作…

2026/10/13 18:18:11 阅读更多 →
手写Bagging与AdaBoost:从数学原理到NumPy原生实现

手写Bagging与AdaBoost:从数学原理到NumPy原生实现

1. 这不是调包,是亲手搭起集成学习的脚手架“Bagging”和“AdaBoost”这两个词,在机器学习入门课里常被简化成两行公式、三张权重图、一段sklearn.ensemble的调用示例。但真正带过学生做课程设计、也帮某高校实验室调试过模型的同学都知道:当…

2026/10/13 18:18:11 阅读更多 →
不依赖偏差规则的多元时间序列异常检测:CyFA超越GDN与KDA

不依赖偏差规则的多元时间序列异常检测:CyFA超越GDN与KDA

这阵子一直在做多变量时间序列异常检测的对比实验,说实话,GDN和KDA这类方法能长期站在基线榜前列,确实有它们的道理。但我自己复现和改动过程中越来越确认一件事:它们对“偏差规则”(我们项目里习惯叫Delta Rule&#…

2026/10/13 18:18:11 阅读更多 →
VINS-FUSION代码阅读指南:从数据结构到滑动窗口优化

VINS-FUSION代码阅读指南:从数据结构到滑动窗口优化

1. 从"能跑通"到"能改懂":VINS-FUSION代码阅读的切入点选择很多人第一次打开VINS-FUSION的代码仓库时,第一反应是"文件好多、类好多、回调好绕"。这很正常,因为它本身就是一个把视觉前端、IMU预积分、滑动窗口…

2026/10/13 18:18:11 阅读更多 →
Java面试实录:从JVM到MySQL,那些让面试官崩溃的基础错误

Java面试实录:从JVM到MySQL,那些让面试官崩溃的基础错误

互联网大厂Java开发者面试实录:严肃面试官遇上搞笑水货程序员谢飞机如果你没经历过那种"简历挺漂亮,开口就崩盘"的Java面试,那你可能还没当过面试官。我在某头部电商平台做Java技术面试官已经有年头了,每周至少面七八个…

2026/10/13 18:17:10 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →