最大子段和问题

给定整数序列,求该序列形如k=ijak的子段和的最大值,1)已知一个简单算法如下:

试分析该算法的时间复杂性。

答:时间复杂度为O(n^2)

2)试用分治算法解最大子段和问题,并分析算法的时间复杂性。

算法思路

需要在序列 中找到一段最优序列,将序列分为,与最邻近点对问题类似,最优序列所在的位置有以下3种情况:

分治法代码

#include<iostream>
#include<cstdio>
#include<map>
#include<string>
#include<set>
#include<vector>
using namespace std;
using namespace std;
// Q1 最大子段和
class Ques20201025
{
public:   void test() { vector<int> arr = {-2,11,-4,13,-5,-2};cout << maxSum(arr,1, arr.size()-1) << endl;int i, j;}
private:// 分治法int maxSum(vector<int> &arr, int left, int right) {int sum = 0;if (left==right) {sum = arr[left]>0?arr[left]:0;         }else{int mid = left + (right - left) / 2;// 最优序列在左边和右边时,递归处理int leftsum=maxSum(arr, left, mid);int rightsum = maxSum(arr, mid + 1, right);// 第3种情况的处理,最优序列跨过中心点midint s1 = 0; int lefts = 0;// s1for (int i = mid; i >= left;i--) {lefts += arr[i];if (lefts>s1) {s1 = lefts;}}int s2 = 0;// s1int rights = 0;for (int i = mid+1; i <= right; i++) {rights += arr[i];if (rights > s2) {s2 = right;}}sum = s1 + s2;// 加在一起if (sum < leftsum)sum = leftsum;if (sum < rightsum)sum = rightsum;}return sum;}
};
int main() {Ques20201025 qus = Ques20201025();qus.test();
}

实现效果

时间复杂度

解得T(n)=O(nlogn)

3)试说明最大子段和问题具有最优子结构性质,并设计一个动态规划算法解最大子段和问题。分析算法的时间复杂度。

说明

动态规划代码

// 动态规划法//设一个b数组,存的是i-j的a[i:j]子串的最大值,则总问题变为max b[j].当b[j-1]>0时,b[j]=b[j-1]+a[j]否则直接a[j]// b[j]=max{b[j-1]+a[j],a[j]}int DnMaxSum(vector<int>& arr) {int n = arr.size() - 1;int sum = 0,b=0;for (int i = 1; i <= n; i++) {if (b > 0) b += arr[i];else b = arr[i];if (b > sum) sum = b;}return sum;}

时间复杂度

只有一个for循环,因此算法的时间复杂度和空间复杂度都是O(n).

算法题目打卡:Ques20201025相关推荐

  1. 本专栏所有力扣题目的目录链接, 刷算法题目的顺序(由易到难/面试频率)/注意点/技巧, 以及思维导图源文件问题(持续更新中)

    这篇文章为本专栏所有力扣题目提供目录链接, 更加方便读者根据题型或面试频率进行阅读, 此外也会介绍我在刷题过程中总结的刷算法题目的顺序/注意点/技巧, 最后说下文中出现的思维导图源文件的问题 和 打卡 ...

  2. PTA数据结构与算法题目集6-4 6-3 6-8

    PTA数据结构与算法题目集(中文) 6-4 链式表的按序号查找 ElementType FindKth( List L, int K ){int index = 0;while(L){++index; ...

  3. PTA数据结构与算法题目集 6-9 二叉树的遍历

    PTA数据结构与算法题目集(中文) 6-9 二叉树的遍历 void InorderTraversal( BinTree BT ){if(BT==NULL)return;if(BT->Left){ ...

  4. leetcode的回溯算法题目用这个模板解题,一网打尽,so easy!!!

    " 这是本人第 46 篇原创博文,每周至少两篇更新,谢谢赏脸阅读文章 这一篇文章来讲解一下如何做leetcode回溯算法题目,这一段时间我把leetcode上面的回溯算法的题目都刷了个遍,发 ...

  5. 微软面试中简单的算法题目(转)

    微软面试中简单的算法题目(转) (说明:这些题就不是什么花样了,考的是你的基础知识怎么样.再聪明而没有实学的人都将会被这些题所淘汰.)  1.链表和数组的区别在哪里? ANSWER 主要在基本概念上的 ...

  6. 算法题目中经典问题(易错点)

    算法题目中经典问题.易错点 (一).二维数组的传参问题 1.方法一:形参为二维数组并给定第二维长度 2.方法二:形参为指向数组的指针并给出数组长度 3.二维数组定义为全局变量 (二).多组测试控制台数 ...

  7. PTA 数据结构与算法题目集(中文)

    一:数据结构与算法题目(中文版) 7-2 一元多项式的乘法与加法运算 (20 分) 7-3 树的同构 (25 分) 7-4 是否同一棵二叉搜索树 (25 分) 7-6 列出连通集 (25 分)(详解) ...

  8. 数据结构与算法题目集7-32——哥尼斯堡的“七桥问题”

    我的数据结构与算法题目集代码仓:https://github.com/617076674/Data-structure-and-algorithm-topic-set 原题链接:https://pin ...

  9. HihoCoder上网络流算法题目建模总结

    经过了几天的学习和做题,我利用刘汝佳书上的网络流算法模板完成了HihoCoder上的几个网络流算法,HihoCoder可能还会继续更新网络流算法,所以我也会接着总结. 这个主要是对网络流算法的建模做分 ...

  10. java 完美洗牌,(2)数组相关算法题目

    数组是最简单的数据结构,占据连续内存并且按顺序存储. 以下是与数组有关的算法题目. (1)查询数组中重复数字 算法思路:(1)利用hash表,没有便放进去,有就返回(Java中HashMap存数字都是 ...

最新文章

  1. 坚持不懈续集 (二) 初学者挑战学习Python编程30天
  2. 浅谈Jquery中的bind()、live()、delegate()、on()绑定事件方式
  3. SpringBoot面向切面编程-用AOP方式管理日志
  4. 【web安全】你的open_basedir安全吗?
  5. 介绍一种在ABAP内核态进行内表高效拷贝的方法,和对应的Java和JavaScript版本的伪实现
  6. 项目管理:软件工程相关知识笔记
  7. Hadoop ecosystem
  8. 3月国内网站流量:腾讯夺第二 360安全中心降至第三
  9. WPF中ListBox的绑定
  10. linux下grep文件内容搜索工具及基本正则表达式详解
  11. python计算工资_python学习之工资结算
  12. 【Mac】 自带的播放器quicktimeplayer 如何带声音2倍速播放
  13. 软件项目的规模、工作量和成本是如何进行估算或评估的?
  14. 解决启动CAD时没有响应
  15. 【单片机】2.9 看门狗定时器(WDT)功能简介
  16. rtmp协议发送mp3和aac裸流的方法
  17. 新的一年,知足,上进,不负野心!
  18. Mixed Content: The page at 'https://m.ctrip.com/webapp/dingzhi/v3_index' was loa
  19. 这27个电源符号,还傻傻分不清楚?
  20. 非官方新人参考之quake3入门碎解

热门文章

  1. 【问题日记】windows11 找不到组策略问题解决
  2. 自我介绍Linux运维小白,运维面试自我介绍
  3. 某宝抢购taobaosnap开发与实现
  4. 如何使用shell限制指定用户shell程序的网络带宽
  5. GIF微信表情如何制作
  6. 在线词云工具生成词云图——Wordart的使用
  7. js文档模式之混杂模式与标准模式
  8. win10重置计算机网络设置,为你解答win10下如何重置网络
  9. android吉他谱组件,android手机吉他谱
  10. html单位pt,CSS单位之pt和px的区别是什么