算法题目打卡:Ques20201025
最大子段和问题
给定整数序列,求该序列形如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相关推荐
- 本专栏所有力扣题目的目录链接, 刷算法题目的顺序(由易到难/面试频率)/注意点/技巧, 以及思维导图源文件问题(持续更新中)
这篇文章为本专栏所有力扣题目提供目录链接, 更加方便读者根据题型或面试频率进行阅读, 此外也会介绍我在刷题过程中总结的刷算法题目的顺序/注意点/技巧, 最后说下文中出现的思维导图源文件的问题 和 打卡 ...
- PTA数据结构与算法题目集6-4 6-3 6-8
PTA数据结构与算法题目集(中文) 6-4 链式表的按序号查找 ElementType FindKth( List L, int K ){int index = 0;while(L){++index; ...
- PTA数据结构与算法题目集 6-9 二叉树的遍历
PTA数据结构与算法题目集(中文) 6-9 二叉树的遍历 void InorderTraversal( BinTree BT ){if(BT==NULL)return;if(BT->Left){ ...
- leetcode的回溯算法题目用这个模板解题,一网打尽,so easy!!!
" 这是本人第 46 篇原创博文,每周至少两篇更新,谢谢赏脸阅读文章 这一篇文章来讲解一下如何做leetcode回溯算法题目,这一段时间我把leetcode上面的回溯算法的题目都刷了个遍,发 ...
- 微软面试中简单的算法题目(转)
微软面试中简单的算法题目(转) (说明:这些题就不是什么花样了,考的是你的基础知识怎么样.再聪明而没有实学的人都将会被这些题所淘汰.) 1.链表和数组的区别在哪里? ANSWER 主要在基本概念上的 ...
- 算法题目中经典问题(易错点)
算法题目中经典问题.易错点 (一).二维数组的传参问题 1.方法一:形参为二维数组并给定第二维长度 2.方法二:形参为指向数组的指针并给出数组长度 3.二维数组定义为全局变量 (二).多组测试控制台数 ...
- PTA 数据结构与算法题目集(中文)
一:数据结构与算法题目(中文版) 7-2 一元多项式的乘法与加法运算 (20 分) 7-3 树的同构 (25 分) 7-4 是否同一棵二叉搜索树 (25 分) 7-6 列出连通集 (25 分)(详解) ...
- 数据结构与算法题目集7-32——哥尼斯堡的“七桥问题”
我的数据结构与算法题目集代码仓:https://github.com/617076674/Data-structure-and-algorithm-topic-set 原题链接:https://pin ...
- HihoCoder上网络流算法题目建模总结
经过了几天的学习和做题,我利用刘汝佳书上的网络流算法模板完成了HihoCoder上的几个网络流算法,HihoCoder可能还会继续更新网络流算法,所以我也会接着总结. 这个主要是对网络流算法的建模做分 ...
- java 完美洗牌,(2)数组相关算法题目
数组是最简单的数据结构,占据连续内存并且按顺序存储. 以下是与数组有关的算法题目. (1)查询数组中重复数字 算法思路:(1)利用hash表,没有便放进去,有就返回(Java中HashMap存数字都是 ...
最新文章
- 坚持不懈续集 (二) 初学者挑战学习Python编程30天
- 浅谈Jquery中的bind()、live()、delegate()、on()绑定事件方式
- SpringBoot面向切面编程-用AOP方式管理日志
- 【web安全】你的open_basedir安全吗?
- 介绍一种在ABAP内核态进行内表高效拷贝的方法,和对应的Java和JavaScript版本的伪实现
- 项目管理:软件工程相关知识笔记
- Hadoop ecosystem
- 3月国内网站流量:腾讯夺第二 360安全中心降至第三
- WPF中ListBox的绑定
- linux下grep文件内容搜索工具及基本正则表达式详解
- python计算工资_python学习之工资结算
- 【Mac】 自带的播放器quicktimeplayer 如何带声音2倍速播放
- 软件项目的规模、工作量和成本是如何进行估算或评估的?
- 解决启动CAD时没有响应
- 【单片机】2.9 看门狗定时器(WDT)功能简介
- rtmp协议发送mp3和aac裸流的方法
- 新的一年,知足,上进,不负野心!
- Mixed Content: The page at 'https://m.ctrip.com/webapp/dingzhi/v3_index' was loa
- 这27个电源符号,还傻傻分不清楚?
- 非官方新人参考之quake3入门碎解