题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。

例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。

第一感觉:看到这道题后,我先想的便是列出所有子数组,求取和再在这些和中求取最大值,这肯定是最简单的了!自己所写的代码如下:

#include "stdafx.h"
#include <iostream>int SubArraySumMax(int arr[], int len);using namespace std;int main(int argc, char* argv[])
{int arr[] = {1, -2, 3, 10, -4, 7, 2, -5};int summax = SubArraySumMax(arr,8);cout<<summax<<endl;return 0;
}int SubArraySumMax(int arr[], int len)
{int i,j;int summax = 0;int sum_temp;for(i=0; i<len; i++){if(summax < arr[i])summax = arr[i];sum_temp = arr[i];for(j=i+1; j<len; j++){sum_temp += arr[j];if(sum_temp > summax)summax = sum_temp;}}return summax;
}

但是这样的思路,其时间复杂度为O(n^2),完全不符合题目所要求的O(n)。自己绞尽脑汁也未能想出更好的办法。。。

在看过标准答案后,惊叹于思想+代码的简单,不过很遗憾,自己并未豁然开朗。

关键未明白为什么可以这样做?根据评论,作者可能使用了所谓“动态规划”(DP)的方法,这应该是数据结构中的知识,看来自己还是井底之蛙,还要继续努力!

标准答案:

// jianzhioffer3.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
//int SubArraySumMax(int arr[], int len);
bool FindGreatestSumOfSubArray
(int *pData,           // an arrayunsigned int nLength, // the length of arrayint &nGreatestSum     // the greatest sum of all sub-arrays
);
using namespace std;/*int main(int argc, char* argv[])
{int arr[] = {1, -2, 3, 10, -4, 7, 2, -5};int summax = SubArraySumMax(arr,8);cout<<summax<<endl;return 0;
}int SubArraySumMax(int arr[], int len)
{int i,j;int summax = 0;int sum_temp;for(i=0; i<len; i++){if(summax < arr[i])summax = arr[i];sum_temp = arr[i];for(j=i+1; j<len; j++){sum_temp += arr[j];if(sum_temp > summax)summax = sum_temp;}}return summax;
}*/int main()
{int arr[] = {1, -2, 3, 10, -4, 7, 2, -5};int nLength = 8;int nGreatestSum;bool IfSuccess = FindGreatestSumOfSubArray(arr,nLength,nGreatestSum);if(IfSuccess)cout<<nGreatestSum<<endl;elsecout<<"Input Error!"<<endl;return 0;
}/////
// Find the greatest sum of all sub-arrays
// Return value: if the input is valid, return true, otherwise return false
/////
bool FindGreatestSumOfSubArray
(int *pData,           // an arrayunsigned int nLength, // the length of arrayint &nGreatestSum     // the greatest sum of all sub-arrays
)
{// if the input is invalid, return falseif((pData == NULL) || (nLength == 0))return false;int nCurSum = nGreatestSum = 0;for(unsigned int i = 0; i < nLength; ++i){nCurSum += pData[i];// if the current sum is negative, discard itif(nCurSum < 0)nCurSum = 0;// if a greater sum is found, update the greatest sumif(nCurSum > nGreatestSum)nGreatestSum = nCurSum;}// if all data are negative, find the greatest element in the arrayif(nGreatestSum == 0){nGreatestSum = pData[0];for(unsigned int i = 1; i < nLength; ++i){if(pData[i] > nGreatestSum)nGreatestSum = pData[i];}}return true;
} 

PS:理解DP后,再来解决它!

转载于:https://www.cnblogs.com/hello-yz/p/3197508.html

剑指offer--3题相关推荐

  1. 【LeetCode 剑指offer刷题】树题6:28 对称二叉树(101. Symmetric Tree)

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 101. Symmetric Tree /**  * Definition for a binary tree no ...

  2. 【LeetCode 剑指offer刷题】数组题2:57 有序数组中和为s的两个数(167 Two Sum II - Input array is sorted)...

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 57 有序数组中和为s的两个数 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是 ...

  3. 【LeetCode 剑指offer刷题】字符串题6:67 把字符串转成整数

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 67 把字符串转成整数 题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符 ...

  4. 【LeetCode 剑指offer刷题】树题16:Kth Smallest Element in a BST

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) Kth Smallest Element in a BST Given a binary search tree, ...

  5. 剑指offer(60-67题)详解

    文章目录 60 把二叉树打印成多行 61 序列化二叉树 62 二叉搜索树第K个节点 63 数据流中的中位数 64 滑动窗口的最大值 65 矩阵中的路径 66 机器人的运动范围 67 剪绳子 欢迎关注个 ...

  6. 剑指offer(34-40题)详解

    文章目录 34 第一个只出现一次的字符 35 数组中的逆序数 36 两个链表的第一个公共节点 37 数字在排序数组中出现的次数 38 二叉树的深度 39 平衡二叉树 40 数组中只出现一次的数字 欢迎 ...

  7. 剑指offer(26-33题)详解

    文章目录 26 二叉搜索树与双向链表 27 字符串的排列 28 数字中出现次数超过一半的数字(待优化)★ 29 最小的K个数 30 连续子数组最大和 31 整数中1出现的次数 32 把数组排成最小的数 ...

  8. 剑指offer(11-25题)详解

    文章目录 11 二进制种1的个数★ 12 数值的正数次方 13 调整数组顺序使奇数位于偶数前面 14 链表中倒数第K个节点 15 反转链表 16 合并两个排序的链表 17 树的子结构 18 二叉树的镜 ...

  9. 剑指offer(1-10题)详解

    文章目录 01二维数组的查找 02替换空格 03从尾到头打印链表 04重建二叉树★ 05 用两个栈实现队列 06旋转数组的最小数字 07 斐波那契数列 08 跳台阶 09 变态跳台阶★ 10 矩阵覆盖 ...

  10. 【LeetCode 剑指offer刷题】回溯法与暴力枚举法题6:Number of Islands

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) Number of Islands Given a 2d grid map of '1's (land) and ' ...

最新文章

  1. 乔安监控云存储_让数据更安全可用,阿里云存储多项新功能发布
  2. 面试:一个 Java 字符串到底有多少个字符?
  3. 二维码会被人类扫完吗?
  4. MySQL用source命令导入不记入binlog中【原创】
  5. 高清HDMI接口保护用TVS二极管阵列选型
  6. C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
  7. diff算法_vue源码解读 diff算法
  8. 15个最佳的 JavaScript 表单验证库
  9. python修改zabbix中的ip
  10. r语言min-max归一化_如何在R中使用min()和max()
  11. IntelliJ IDEA安装AngularJS插件
  12. 算法真的“难”吗?其实也不见得...
  13. 多显示器被禁用无法开启_高刷等带来丝滑游戏体验:华硕ROG XG32VC电竞显示器...
  14. 74hc595数码管C语言,74HC595 数码管程序
  15. android intent scheme,android Scheme使用 打开指定的Activity
  16. 作用域和作用域链 精解
  17. linux scp控制带宽,Linux系统中安装使用Trickle来控制用户带宽
  18. Pytorch1.1.0 入门 自定义op(python)
  19. fivem服务器文件,云梦YumVGTA5 FiveM 服务器插件管理器
  20. 详细介绍用MATLAB实现基于A*算法的路径规划(附完整的代码,代码逐行进行解释)(一)--------A*算法简介和环境的创建

热门文章

  1. scrolling=no 无法根据坐标获取元素_汽车制造行业如何选择三坐标测量仪?
  2. linux vscode vim,VSCode Vim进阶操作
  3. centos 下安装mysql,linux(Centos7)下安装mysql8.0.18的教程图解
  4. java正则截取xml节点_实例讲述Java使用正则表达式截取重复出现的XML字符串功能...
  5. python字符串操作
  6. 考研规划计算机科学与技术,【图片】2020考研,老学长教你如何规划!【计算机考研吧】_百度贴吧...
  7. mongodb在mysql中怎么用,mongoDB数据库基本操作
  8. android+邮箱删除邮件,在Android上删除烦人的语音邮件通知 | MOS86
  9. 习题8_6与习题9_2
  10. Python,Opencv cv2.Canny()边缘检测