最大子序和问题——动态规划/贪心算法解决

目录

一:问题描述

二:解决思路1——动态规划思想

三:C 语言代码实现

 四:复杂度分析

 五:解决思路2——贪心算法思想

六:具体步骤

七: C语言代码实现

八:复杂度分析


一:问题描述

最大子序和问题指的是在一个整数数组里,找出一个具有最大和的连续子数组(子数组最少包含一个元素),然后返回其最大和。

例如,对于数组 [-2,1,-3,4,-1,2,1,-5,4],其连续子数组 [4,-1,2,1] 的和最大,为 6。

二:解决思路1——动态规划思想

  1. 定义一个数组 dp,其中 dp[i] 代表以第 i 个元素结尾的连续子数组的最大和。
  2. 状态转移方程:dp[i] = max(dp[i - 1] + nums[i], nums[i])。也就是说,以第 i 个元素结尾的连续子数组的最大和,要么是把第 i 个元素加入到以第 i - 1 个元素结尾的连续子数组中,要么是第 i 个元素单独作为一个子数组。
  3. 最终的最大子序和就是 dp 数组中的最大值。

三:C 语言代码实现

#include <stdio.h>// 函数用于找出最大子序和
int maxSubArray(int* nums, int numsSize) {if (numsSize == 0) return 0;int dp[numsSize];dp[0] = nums[0];int max_sum = dp[0];for (int i = 1; i < numsSize; i++) {// 状态转移方程if (dp[i - 1] + nums[i] > nums[i]) {dp[i] = dp[i - 1] + nums[i];} else {dp[i] = nums[i];}// 更新最大和if (dp[i] > max_sum) {max_sum = dp[i];}}return max_sum;
}int main() {int nums[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};int numsSize = sizeof(nums) / sizeof(nums[0]);int result = maxSubArray(nums, numsSize);printf("最大子序和为: %d\n", result);return 0;
}

 四:复杂度分析

  • 算法的时间复杂度为 (O(n)),其中 n 是数组的长度。

 五:解决思路2——贪心算法思想

贪心算法的核心思想在于每一步都做出当下看起来最优的选择,期望通过局部最优解来达成全局最优解。

在最大子序和问题中,我们可以在遍历数组的过程里,持续更新当前的连续子数组和,并且在每一步都判断是否要更新最大和。

六:具体步骤

  1. 初始化变量

    • 定义两个变量,current_sum 用于记录当前连续子数组的和,初始值设为数组的第一个元素。
    • max_sum 用于记录到目前为止所找到的最大子序和,初始值也设为数组的第一个元素。
  2. 遍历数组

    • 从数组的第二个元素开始遍历。
    • 对于每一个元素 nums[i],有两种情况:
      • 如果 current_sum 加上当前元素 nums[i] 后比 nums[i] 本身大,那么就把 nums[i] 加入到当前连续子数组中,即 current_sum = current_sum + nums[i]
      • 反之,说明之前的连续子数组和是负数,继续保留它会让和变小,所以舍弃之前的连续子数组,从当前元素 nums[i] 开始一个新的连续子数组,即 current_sum = nums[i]
  3. 更新最大和

    • 在每次更新 current_sum 之后,比较 current_sum 和 max_sum 的大小。如果 current_sum 大于 max_sum,就更新 max_sum 为 current_sum
  4. 返回结果

    • 遍历完整个数组后,max_sum 中存储的就是最大子序和,将其返回。

七: C语言代码实现

#include <stdio.h>// 函数用于找出最大子序和
int maxSubArray(int* nums, int numsSize) {if (numsSize == 0) return 0;int current_sum = nums[0];int max_sum = nums[0];for (int i = 1; i < numsSize; i++) {// 判断是否更新当前连续子数组和if (current_sum + nums[i] > nums[i]) {current_sum = current_sum + nums[i];} else {current_sum = nums[i];}// 更新最大和if (current_sum > max_sum) {max_sum = current_sum;}}return max_sum;
}int main() {int nums[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};int numsSize = sizeof(nums) / sizeof(nums[0]);int result = maxSubArray(nums, numsSize);printf("最大子序和为: %d\n", result);return 0;
}

八:复杂度分析

  • 时间复杂度(O(n)),这里的 n 是数组的长度。因为只需要对数组进行一次遍历。
  • 空间复杂度(O(1)),只使用了常数级的额外空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python入门】文件读取全攻略:5种常用格式(csv/excel/word/ppt/pdf)一键搞定 | 附完整代码示例

大家好&#xff0c;我是唐叔&#xff01;今天给大家带来一篇Python文件读取的终极指南。无论是数据分析、办公自动化还是爬虫开发&#xff0c;文件读取都是Python程序员必须掌握的核心技能。本文将详细介绍Python处理5大常用文件格式的方法&#xff0c;包含完整可运行的代码示例…

四、小白如何用Pygame制作一款跑酷类游戏(页面暂停和主角跑步动作的实现)

四、小白如何用Pygame制作一款跑酷类游戏&#xff08;页面暂停和主角跑步动作的实现&#xff09; 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 四、小白如何用Pygame制作一款跑酷类游戏&#xff08;页面暂停和主…

《基于 RNN 的股票预测模型代码优化:从重塑到直接可视化》

在深度学习领域&#xff0c;使用循环神经网络&#xff08;RNN&#xff09;进行股票价格预测是一个常见且具有挑战性的任务。本文将围绕一段基于 RNN 的股票预测代码的改动前后差别展开&#xff0c;深入剖析代码的优化思路和效果。 原始代码思路与问题 原始代码实现了一个完整…

Lambda 函数与 peek 操作的使用案例

Lambda 函数和 peek 操作是 Java 8 Stream API 中非常有用的特性&#xff0c;下面我将介绍它们的使用案例。 Lambda 函数使用案例 Lambda 表达式是 Java 8 引入的一种简洁的匿名函数表示方式。 集合操作 List<String> names Arrays.asList("Alice", "B…

Docker私有仓库页面访问实现

通过 docker run -d -p 5000:5000 --name registry registry:2 命令搭建的Docker私有仓库默认不提供网页访问界面。它是一个基于API的后端服务&#xff0c;主要用于镜像的存储和管理。但可以通过以下两种方式实现网页访问&#xff1a; 一、通过第三方Web UI工具扩展 1. 使用 D…

[王阳明代数讲义]语言模型核心代码调研

语言模型核心代码调研 基于Consciciteation‌的才气张量持续思考综述将文本生成建模为才气张量网络扩散过程&#xff0c;实现非自回归推理通过才气张量的群-拓扑流形交叉注意力实现多模态推理&#xff0c;将输入压缩到低维空间持续迭代提出「条件计算提前终止」机制&#xff0c…

flink jobmanager离奇的heap oom

文章目录 现象描述开始分析1.初步分析dump文件2.AI分析引用关系分析方向2.1 flink BlobServer bug分析方向2.2 和运行环境有关分析方向2.3 和任务有关 回到问题本身&#xff0c;思考一下1. seatunnel到底有没有问题2.再次分析zipfile对象3.分析seatunnel es connector 源码4 怀…

APP动态交互原型实例|墨刀变量控制+条件判断教程

引言 不同行业的产品经理在绘制原型图时&#xff0c;拥有不同的呈现方式。对于第三方软件技术服务公司的产品经理来说&#xff0c;高保真动态交互原型不仅可以在开发前验证交互逻辑&#xff0c;还能为甲方客户带来更直观、真实的体验。 本文第三部分将分享一个实战案例&#…

AI 驱动下的后端开发架构革命:从智能协同体系

AI 驱动下的后端开发架构革命&#xff1a;从智能协同体系 一、引言&#xff1a;AI 重构后端开发范式 在 2025 年的企业级技术演进中&#xff0c;人工智能正从辅助工具升级为核心架构要素。根据 Gartner《2025 智能技术栈成熟度报告》&#xff0c;传统 "人力编码 硬规则…

安卓基础(生命周期)

创建阶段&#xff1a;onCreate方法被调用&#xff0c;用于初始化 Activity&#xff0c;如设置布局等。启动阶段&#xff1a;依次调用onStart和onResume方法&#xff0c;让 Activity 变得可见并可与用户交互。暂停与恢复阶段&#xff1a;当 Activity 失去焦点但可见时&#xff0…

Uniapp: 下拉选择框 ba-tree-picker

目录 1、效果展示2、如何使用2.1 插件市场2.2 引入插件 3、参数配置3.1 属性3.2 方法 4、遇见的问题4.1、设置下拉树的样式 1、效果展示 2、如何使用 2.1 插件市场 首先从插件市场中将插件导入到项目中 2.2 引入插件 在使用的页面引入插件 <view click"showPicke…

Spring Boot实战:基于策略模式+代理模式手写幂等性注解组件

一、为什么需要幂等性&#xff1f; 核心定义&#xff1a;在分布式系统中&#xff0c;一个操作无论执行一次还是多次&#xff0c;最终结果都保持一致。 典型场景&#xff1a; 用户重复点击提交按钮网络抖动导致的请求重试消息队列的重复消费支付系统的回调通知 不处理幂等的风…

如何恢复极狐GitLab?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 恢复极狐GitLab (BASIC SELF) 极狐GitLab 提供了一个命令行界面来恢复整个安装&#xff0c;足够灵活以满足您的需求。 恢复…

面试高阶问题:android后台任务(如数据同步、定位)消耗过多电量,导致用户投诉。你会如何分析和优化后台任务的执行?

在现代移动设备生态中,安卓系统以其开放性和灵活性占据了全球智能手机市场的绝大部分份额。作为一款功能强大的操作系统,安卓允许应用程序在后台执行各种任务,例如数据同步、定位服务、消息推送以及其他周期性更新。这些后台任务在提升用户体验方面扮演了不可或缺的角色——…

最近在学习web搞大屏看板

人到中年&#xff0c;delphi发展越来越不行&#xff0c;就业环境是真差啊&#xff0c;没办法&#xff0c;学呗 中国地图&#xff1a; // 中国地图function getChinaMapChart() {// 初始化echarts实例var myEcharts echarts.init(document.getElementById("china_box"…

117.在 Vue 3 中使用 OpenLayers 实现 CTRL 控制拖拽和滚动缩放

✨ 前言 在使用 OpenLayers 开发地图类项目时,我们有时会希望用户必须按下 CTRL(或 Mac 的 Command ⌘ 键)才能拖拽地图或使用鼠标滚轮缩放。这种交互方式能够避免用户在浏览页面时意外滑动或拖动地图,尤其是在地图嵌入页面中时非常有用。 本文将带你一步一步实现在 Vue …

MATLAB 控制系统设计与仿真 - 34

多变量系统知识回顾 - MIMO system 这一章对深入理解多变量系统以及鲁棒分析至关重要 首先,对于如下系统: 当G(s)为单输入,单输出系统时: 如果: 则: 所以 因此,对于SISO,系统的增益跟w有关系, 当G(s)为MIMO时,例如2X2时, 假设输入信号为:

ARCGIS PRO DSK 利用两期地表DEM数据计算工程土方量

利用两期地表DEM数据计算工程土方量需要准许以下数据&#xff1a; 当前地图有3个图层&#xff0c;两个栅格图层和一个矢量图层 两个栅格图层&#xff1a;beforeDem为工程施工前的地表DEM模型 afterDem为工程施工后的地表DEM模型 一个矢量图层&#xf…

最快打包WPF 应用程序

在 Visual Studio 中右键项目选择“发布”&#xff0c;目标选“文件夹”&#xff0c;模式选“自包含”&#xff0c;生成含 .exe 的文件夹&#xff0c;压缩后可直接发给别人或解压运行&#xff0c;无需安装任何东西。 最简单直接的新手做法&#xff1a; 用 Visual Studio 的“…

物联网通信协议——TCP与MQTT的对比

在物联网通信中&#xff0c;MQTT和TCP的实现方式和原理完全不同&#xff0c;因为两者属于协议栈的不同层级&#xff0c;解决的问题也不同。以下从协议层级、工作机制和典型场景三个角度详细解释&#xff1a; 1. 协议层级与定位 特性TCPMQTT协议层级传输层&#xff08;第4层&am…