01-复杂度1 最大子列和问题   (20分)

给定KK个整数组成的序列{ N​1​​, N​2​​, ..., N​K​​ },“连续子列”被定义为{ N​i​​, N​i+1​​, ..., N​j​​ },其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。

本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下:

  • 数据1:与样例等价,测试基本正确性;
  • 数据2:102个随机整数;
  • 数据3:103个随机整数;
  • 数据4:104个随机整数;
  • 数据5:105个随机整数;

输入格式:

输入第1行给出正整数KK (≤100000);第2行给出KK个整数,其间以空格分隔。

输出格式:

在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。

输入样例:

  1. 6
  2. -2 11 -4 13 -5 -2

输出样例:

  1. 20
  2.  
  3. g++编译:
  1. //01 - 复杂度1 最大子列和问题(20分)
  2. //例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。
  3. //
  4. //本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下:
  5. //
  6. //数据1:与样例等价,测试基本正确性;
  7. //数据2:10^2个随机整数;
  8. //数据3:10^3个随机整数;
  9. //数据4:10^4个随机整数;
  10. //数据5:10^5个随机整数;
  11. //输入格式 :
  12. //
  13. //输入第1行给出正整数KK(\le 100000≤100000);第2行给出KK个整数,其间以空格分隔。
  14. //
  15. //输出格式 :
  16. //
  17. //在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。
  18. //
  19. //输入样例 :
  20. //
  21. //6
  22. //- 2 11 - 4 13 - 5 - 2
  23. //输出样例 :
  24. //
  25. //
  26.  
  27. #include <iostream>
  28. using namespace std;
  29. #include <vector>
  30.  
  31. #define max(a,b) (((a) > (b)) ? (a) : (b))
  32.  
  33. int GetMaxSubsum(vector<int> vec_);
  34.  
  35. int main()
  36. {
  37. int k;
  38. int num;
  39. int ret = ;
  40. vector<int> vec;
  41. while (cin>>k)
  42. {
  43. for (int i = ; i < k;i++)
  44. {
  45. cin >> num;
  46. vec.push_back(num);
  47. }
  48.  
  49. ret = GetMaxSubsum(vec);
  50. cout << ret << endl;
  51. vec.clear();
  52. }
  53. return ;
  54. }
  55.  
  56. int GetMaxSubsum(vector<int> vec_)
  57. {
  58. int tempSum = ;
  59. int ret_sum = ;
  60. if (vec_.size()<=)
  61. {
  62. return ;
  63. }
  64. else
  65. {
  66. tempSum = vec_[];
  67. ret_sum = vec_[];
  68. for (int i = ; i < vec_.size();i++)
  69. {
  70. tempSum = (tempSum < ) ? vec_[i] : (tempSum + vec_[i]);
  71. ret_sum = max(tempSum,ret_sum);
  72. }
  73. return ret_sum;
  74. }
  75. return ret_sum;
  76. }

本题参考了剑指offer:  连续子数组的最大和

题目描述

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至少是1)
  1. class Solution {
  2. public:
  3. int FindGreatestSumOfSubArray(vector<int> array) {
  4. if(array.size()==) return ;
  5. int sum1 = array[];
  6. int temp = array[];
  7. for(int i=;i<array.size();i++){
  8. //temp为当前数组的和,当求和小于0时,重新选择求和起点
  9. //只要有负数,temp就会减少,此时sum1>temp;当减少为负数时,temp重新赋值;直到遇到正数时,又开始求和
  10. temp = (temp<?array[i]:array[i]+temp);
  11. sum1 = max(sum1, temp);//sum1暂时求得的和,如果后面有比sum1大的求和值,则取而代之
  12. }
  13. return sum1;
  14. }
  15. };

视频中老师讲解了四种算法:暴力O(N*3),优化暴力O(N*2),分而治之O(NlogN),在线处理O(N)

这是跟着《中国大学MOOC-陈越、何钦铭-数据结构-2017春》课程学习的第一次练习,希望能够坚持者两个月;虽然还有其他的项目和研究方向和小论文的压力,不过这并不冲突;相信基础最重要的。

 

01-复杂度1 最大子列和问题(剑指offer和PAT)的更多相关文章

  1. PAT复杂度_最大子列和问题、最大子列和变种

    01-复杂度1. 最大子列和问题 给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j ...

  2. 剑指Offer - 九度1372 - 最大子向量和(连续子数组的最大和)

    剑指Offer - 九度1372 - 最大子向量和(连续子数组的最大和)2013-11-23 16:25 题目描述: HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天JOBDU测试组开完会后, ...

  3. 【剑指Offer面试编程题】题目1372:最大子向量和--九度OJ

    题目描述: HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天JOBDU测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但 ...

  4. 剑指Offer - 九度1524 - 复杂链表的复制

    剑指Offer - 九度1524 - 复杂链表的复制2014-02-07 01:30 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点 ...

  5. 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先

    剑指Offer - 九度1509 - 树中两个结点的最低公共祖先2014-02-07 01:04 题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样 ...

  6. 剑指Offer - 九度1515 - 打印1到最大的N位数

    剑指Offer - 九度1515 - 打印1到最大的N位数2013-11-30 01:11 题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案 ...

  7. 剑指Offer - 九度1391 - 顺时针打印矩阵

    剑指Offer - 九度1391 - 顺时针打印矩阵2013-11-24 04:55 题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 ...

  8. 剑指Offer - 九度1386 - 旋转数组的最小数字

    剑指Offer - 九度1386 - 旋转数组的最小数字2013-11-24 01:57 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转 ...

  9. 剑指Offer - 九度1384 - 二维数组中的查找

    剑指Offer - 九度1384 - 二维数组中的查找2013-11-23 23:23 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个 ...

随机推荐

  1. Codeforces 999F Cards and Joy(二维DP)

    题目链接:http://codeforces.com/problemset/problem/999/F 题目大意:有n个人,n*k张卡牌,每个人会发到k张卡牌,每个人都有一种喜欢的卡牌f[i],当一个 ...

  2. Zookeeper简介(一)

    使用Zookeeper已经有几年时间了,零零散散的积累了一些经验,但从未想过能写出一些列的文章分享出来.从今天起,计划持续更新关于Zookeeper相关的文章,从基本的搭建使用.原理分析.典型场景分析 ...

  3. javafx点击鼠标出现弹窗,demo

    在学习javafx的过程中,不知道怎么出现一个弹窗,如,点击一个按钮出现一个修改信息的列表选项 终于在javafx文档示例中发现了类似的东西,记录一下,备忘package demo9_button; ...

  4. 《剑指offer》-链表找环入口

    题目描述 一个链表中包含环,请找出该链表的环的入口结点. 初步想法是每个节点做几个标记,表示是否被访问过,那么遍历链表的时候就知道哪个被访问到了.但是不会实现. 另一个直觉是判断链表有环的算法中出现过 ...

  5. Ext.js入门

    一:ExtJs简介: ExtJs通常简称为Ext,它是一个非常优秀的Ajax框架,用Javascript编写,它与后台技术无关,可以用来开发具有炫丽外观的富客户端应用.Ext所开发的多彩界面吸引了许多 ...

  6. 深入了解Activiti工作流流程定义

    深入了解Activiti工作流流程定义 2016-03-27| 发布: | 浏览: 2363 |保存PDF 部署流程定义 部署流程定义的流程: 1. 先获取流程引擎对象:在创建时会自动加载 class ...

  7. 【Java】 剑指offer(26) 树的子结构

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入两棵二叉树A和B,判断B是不是A的子结构. 思路 1)先对A树 ...

  8. 057 Hive项目案例过程

    1.说明 这里只粘贴一张,图,主要针对的hive的项目的实践过程. 2.图 3.需求 统计PV 统计注册人数 => 这个是一个公司会关注的,每天的注册率. 统计ip 统计跳出率 => ip ...

  9. NumPy学习(索引和切片,合并,分割,copy与deep copy)

    NumPy学习(索引和切片,合并,分割,copy与deep copy) 目录 索引和切片 合并 分割 copy与deep copy 索引和切片 通过索引和切片可以访问以及修改数组元素的值 一维数组 程 ...

  10. java中的instanceof用法详解

    instanceof是Java的一个二元操作符(运算符),也是Java的保留关键字.它的作用是判断其左边对象是否为其右边类的实例,返回的是boolean类型的数据.用它来判断某个对象是否是某个Clas ...