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

思路:我们的最直观的想法就是求出这个数组中的所有的子数组,然后比较他们的和的大小,如果输入的数组元素个数为N,那么就要有N(N+1)/2个子数组。很明显是不符合要求的。然后我可以用动态规划的思想。假设sum(i)以第i个元素结尾的连续的最大的子数组和。假设i前面的子数组之和都已经求出。那么sum(i)要么就是sum(i-1)和a[i]的和,要么就是a[i]本身,这个取决于Sum(i-1)是否大于0.由于只需要保存前一次的结果,而不需要向其他的动态规划一样保存之前所有的结果,因此时间复杂度很低。

第二种思路:举例分析数组的规律

两者者有异曲同工之妙。

public class subArraySumMax {
private boolean isInvaildPut = false;//要来区分无效输入返回的0,还是数组最大值返回为0; public int subArraySumMaxOfArray(int[] a){
if(a==null){
isInvaildPut=true;
return 0;
}
isInvaildPut=false;
int curNumber=a[0];//记载当前子数组的和的值
int maxNumber=a[0];//存放子数组最大和的值
for(int i=1;i<a.length;i++){
if(curNumber<=0)
curNumber=a[i];
else
curNumber+=a[i];
if(curNumber>maxNumber)
maxNumber=curNumber;
}
return maxNumber;
}
public static void main(String[] args){
int[] a={1,-2,3,10,-4,7,2,-5};
subArraySumMax subMax=new subArraySumMax();
int sum=subMax.subArraySumMaxOfArray(a);
System.out.println(sum); } }

剑指offer-第五章优化时间和空间效率(连续子数组的最大和)的更多相关文章

  1. 剑指offer-第五章优化时间和空间效率(数组中的逆序对的总数)

    题目:在数组中如果两个数字的前面的数比后面的数大,则称为一对逆序对.输入一个数组求出数组中逆序对的总数. 以空间换时间:思路:借助一个辅助数组,将原来的数组复制到该数组中.然后将该数组分成子数组,然后 ...

  2. 剑指offer-第五章优化时间和空间效率(从1到n的整数中1出现的次数)

    题目:输入一个整数n,从1到n这n个十进制整数中1出现的次数. 思路1:对1到n中的任意一个数i对其进行求余数来判断个位是否为1,然后再求除数,判断十位是否为1.统计出1的个数.然后对1到n用一个循环 ...

  3. 剑指offer-第五章优化时间和空间效率(数组中出现次数超过一半的数字)

    题目:输入一个数组,找出一个数字,它在数组中出现的次数超过数组的一半. 题目规定如果可以改变数组中元素的位置. 思路1:如果数组是排序的,那么中间元素的位置不就是次数超过数组一半的元素吗?是的,因此我 ...

  4. 剑指offer-第五章优化时间和空间效率(把数组排列成最小的数)

    题目:输入一个正整数数组,将所有的数,排列起来,组成一个最小的数.

  5. 剑指offer-第五章优化时间和空间效率(两个链表的第一个公共节点)

    思路1:要求的是两个链表的第一个公共节点,首先想到的是用栈来存放两个链表,然后依次从栈中抛出,直到最后一个相同的节点为止.但是要用到两个栈,空间复杂度为O(n): 思路2:从头到尾分别遍历两个链表得到 ...

  6. 剑指offer-第五章优化时间和空间效率(在字符串中第一次出现切只出现一次的字符)

    题目:在字符串中第一次出现切只出现一次的字符 思路:用HashMap来存放对应的char值和该char出现的次数.做一次变量就可以得到第一个只出现一次的字符. Java代码: import java. ...

  7. 剑指offer-第五章优化时间和空间效率(最小的k个数)

    题目:输入n个数,输出最小的k个数. 时间复杂度为O(n) 思路1:我们想的到的最直接的思路就是对这个N个数进行排序,然后就可以找到最小的k个了,同样可以用快排partition.但是只要找到前K个最 ...

  8. 剑指offer第五章

    剑指offer第五章 1.数组中出现次数超过一半的数 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组 ...

  9. 剑指offer-第5章优化时间和空间效率(丑数)

    题目:我们把只包含因子2,3,5的数叫做丑数.寻找第1500个丑数.通常把1当成第一个丑数. 思路1:第一步判断是否为丑数:丑数是只包含2,3,5的数,因此一定可以被2,3,5整除.通过求余数是否为零 ...

随机推荐

  1. 优秀 H5 案例收集 vol.3(不定期更新)

    上期浏览:Vol.1   Vol.2 爱的不同定义,五笔连成爱http://news.163.com/special/fdh5_valentines/ 世界华语悬疑文学大赛—下一位悬疑大师,就是你!h ...

  2. 配置火星板(MarS Board)的启动参数

    昨天终于拿到了MarS Board.本来上周就应该到的,结果销售人员给我发了块BeagleBone Black... 要是给我的是Sabre Lite也就算了.发错货总是消费者吃亏,好像没怎么听说过占 ...

  3. openstack认证实践

    环境: 客户端:负责发送请求, 服务器:负责接受请求: 认证服务器keystone:负责认证 具体认证步骤: 1.客户端首先进行签名计算,将得到的签名字符串作为authorization发给keyst ...

  4. 程序包com.sun.istack.internal不存在

    添加一下依赖 <!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-impl --><dependency> ...

  5. C++ vector 多次删除第一个元素

    转载声明: 代码都是来源于一下连接,做了一点点修改,为了记忆方便,故贴在这里,原文链接:http://blog.csdn.net/doctor_feng/article/details/1188078 ...

  6. javascript页面打印

    打印本身比较简单,但要考虑到具体的需求.比如 1. 多浏览器: if (isIE()) { //打印预览 WebBrowser1.execWB(7, 1); } else { window.print ...

  7. MD5加密算法的java实现

    package other; import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/* * ...

  8. 【C#笔札】 界面逐渐显现的实现

    如果labview做 就如同上图,so eazy! 现改C#实现这个简单的功能. 在工具箱找到Timer控件 双击 思路如下,界面打开时触发timer事件,每隔一段时间调整界面透明度 开搞 属性框中的 ...

  9. App如何推广秘籍之”渠道为王”

    现在市场上主流的APP从开发环境和搭载系统上来区分主要分为三种类型,它们是适用于iphone手机的ios版本.适用于安卓手机的 android版本和适用于window phone的WP8系统.由于每个 ...

  10. 【scala】类的定义和单例对象

    一.类的定义 Scala类的定义跟JAVA中类的定义基本是一样的. 示例 class ChecksumAccumulator{ var sum = 0;//Scala默认关键字为public priv ...