Github的用户名为heiheitian

教科书:代码大全第2版

重构

一维最大子数组之和:

#include<stdio.h>
void MaxSumSonArrays(int a[],int length)
{
int sum=0,currentsum=0,i;//sum表示子数组和的最大值,currentsum表示当前子数组的和
int begin=0,end=0;
if(a==NULL||length<=0)
printf("Array Error!\n");//检测输入数组是否合法
for(i=0;i<length;i++)
{
if(currentsum<=0)
{
currentsum=a[i];
begin=i+1;
}
else
currentsum+=a[i];
if(currentsum>sum)
{
sum=currentsum;
end=i+1;
}
}
printf("sum=%d:\nfrom: %d to %d\n",sum,begin,end);
}
int main()
{
int length,i;
int a[10000]={0};
scanf("%d",&length);
for(i=0;i<length;i++)
scanf("%d",&a[i]);
MaxSumSonArrays(a,length);
return 0;
}

设计思路:

本题最基本的想法有求出数组所有子数组的和,然后选出最大的一个,假设数组长度为n,则其子数组共有n*(n+1)/2个,及时间复杂度为O(n*n),当数组数量很大时,显然不能满足要求。

本题还有一种巧妙的算法,即设置一个当前子数组和的变量currentsum和一个最大子数组和的变量sum,当currentsum的值小于0时,说明sum不应该包含这一段数据,则currentsum将下一个数据作为起始,否则currentsum继续添加下一个数据;在currentsum添加数据的过程中,sum始终保持currentsum改变过程中的最大值,这样遍历一遍数组即可求出最大子数组的和,时间复杂度为O(n),面对大数据时也可以顺利解决。

work_1的更多相关文章

  1. HDU5840 (分块+树链剖分)

    Problem This world need more Zhu 题目大意 给一颗n个点的有点权的树,有m个询问,对于每个询问u,v,k,首先将点u到点v的最短路径上的所有点按顺序编号,u的编号为1, ...

  2. HDU4897 (树链剖分+线段树)

    Problem Little Devil I (HDU4897) 题目大意 给定一棵树,每条边的颜色为黑或白,起始时均为白. 支持3种操作: 操作1:将a->b的路径中的所有边的颜色翻转. 操作 ...

  3. C++利用注册表添加桌面右键新建菜单

    对于程序员来说,新建一个cpp文件是再频繁不过的事情了. 为了方便,我们习惯在桌面右键新建文件,而不是新建一个文本文档,然后修改后缀名. 百度谷歌查询了一下,终于知道如何添加注册表. 手痒,抽出时间用 ...

  4. 【CF39E】【博弈论】What Has Dirichlet Got to Do with That?

    Description You all know the Dirichlet principle, the point of which is that if n boxes have no less ...

  5. day36-多进程多线程一

    多进程 概念:进程是程序在计算机上的一次执行活动.当你运行一个程序,你就启动了一个进程.显然,程序是死的(静态的),进程是活的(动态的).进程可以分为系统进程和用户进程.凡是用于完成操作系统的各种功能 ...

  6. py-函数基础

    定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 特性: 1.减少重复代码2.使程序变的可扩展3.使程序变得易维护 函数参数 形参变量 只有在被调 ...

  7. Python学习笔记 - day14 - Celery异步任务

    Celery概述 关于celery的定义,首先来看官方网站: Celery(芹菜) 是一个简单.灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具. 简单来看,是一个基于pyt ...

  8. Day 19 函数之闭包、装饰器

    一.什么是装饰器 器即函数 装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 二.装饰器遵循的原则 1.不修改被装饰函数的源代码(开放封闭原则) 2.为被装饰 ...

  9. AOP面向方面编程---postsharp

    PostSharp是一个用于在.NET平台上实现AOP(Aspect-Oriented Programming,面向方面编程)的框架,现通过简单的示例代码来演示如何使用postsharp. 1.新建一 ...

随机推荐

  1. UVa 11922 - Permutation Transformer 伸展树

    第一棵伸展树,各种调试模板……TVT 对于 1 n 这种查询我处理的不太好,之前序列前后没有添加冗余节点,一直Runtime Error. 后来加上冗余节点之后又出了别的状况,因为多了 0 和 n+1 ...

  2. 10个最佳的PHP图像操作库

    Thomas Boutell 以及众多的开发者创造了以GD图形库闻名的一个图形软件库,用于动态的图形计算. GD提供了对于诸如C, Perl, Python, PHP, OCaml等等诸多编程语言的支 ...

  3. 非常实用的PHP代码片段推荐

    当使用PHP进行开发的时候,如果你自己收 藏 了一些非常有用的方法或者代码片段,那么将会给你的开发工作带来极大的便利.今天我们将介绍10个超级好用的PHP代码片段,希望大家能够喜欢! 1.  使用te ...

  4. Android使用Fragment程序崩溃

    调用Fragment的Activity要继承并实现Fragment.OnFragmentInteractionListener

  5. Oracle学习之集合运算

    一.集合运算操作符  UNION:(并集)返回两个集合去掉重复值的所有的记录  UNION ALL:(并集)返回两个集合去掉重复值的所有的记录 INTERSECT:(交集)返回两个集合的所有记录,重复 ...

  6. 1128. Partition into Groups(图着色bfs)

    1128 写的dfs貌似不太对 bfs重写 用bfs将图进行黑白染色 如果有超过一个与自己颜色相同的点 就把该点存入栈中 最后处理栈中的点 判断此点是否合法 不合法 取反 取反后再判断相邻点是否合法 ...

  7. voliecty indexOf的写法

    Velocity allows you to use all Java methods available in your objects. So just write as if it was Ja ...

  8. bzoj1717: [Usaco2006 Dec]Milk Patterns 产奶的模式

    后缀数组+二分答案+离散化.(上次写的时候看数据小没离散化然后一直WA...写了lsj师兄的写法. #include<cstdio> #include<cstring> #in ...

  9. poj 1201 Intervals(差分约束)

    做的第一道差分约束的题目,思考了一天,终于把差分约束弄懂了O(∩_∩)O哈哈~ 题意(略坑):三元组{ai,bi,ci},表示区间[ai,bi]上至少要有ci个数字相同,其实就是说,在区间[0,500 ...

  10. ios8.3 编译 arm64版 openssl-1.0.2a

    xcode是6.3版的,ios sdk 是8.3的, 到http://www.openssl.org/source/下载最新版本openssl-1.0.2a 解压后用文本编辑器打开configure文 ...