每日一记,今天开始

从今天开始每天争取自己手写一两个小程序,即使是从书上看的,或者从网上学的,都自己手动地把代码打出来,贴在这里。

培养自己这个习惯,尽最大可能坚持下来。

水滴石穿,绳锯木断。

2014年9月10日

今天学习的是:求最大子序列和

有三种算法:

1 复杂度为O(N2)

 1 package findmaxsub;
 2
 3 //求最大子序列和算法1:相当是遍历了一遍
 4
 5 public class FindMaxSu {
 6
 7     public static void main(String[] args) {
 8         // TODO Auto-generated method stub
 9         int[] a = new int[] {4,-3,5,-2,-1,2,6,-2,10};
10         System.out.println(findMax(a));
11
12     }
13     private static int findMax(int [] array){
14         int maxSum = 0;
15         for(int i=0;i<array.length;i++){
16             int sum=0;
17             for(int j=i;j<array.length;j++){
18                 sum+=array[j];
19                 if(sum>maxSum){//注意这个if的位置
20                     maxSum=sum;
21                 }
22             }
23         }
24         return maxSum;
25     }
26 }

2 复杂度为O(NlogN)

 1 package findmaxsub;
 2
 3 //寻找最大子序列和的算法2
 4 //基本思路:最大子序列和三种情况:出现在数据的左半部分,右半部分,跨越数据的中部从而位于左右两半部分之中
 5 //前两种情况用递归,后一种情况简单地用两个for循环就行了
 6
 7 //分而治之的思想:divide-and-conquer
 8 //递归的思想
 9 //关键是处理第三种情况为什么能用两个简单的循环:因为子序列的头已经确定了,必须包含这个中间的元素
10
11 public class FindMaxSub {
12
13     /**
14      * @param args
15      */
16     public static void main(String[] args) {
17         // TODO Auto-generated method stub
18
19         int[] arr = new int[]{4,-3,5,-2,-1,2,6,-2,10};
20         System.out.println(maxSub(arr,0,arr.length-1));
21
22
23     }
24
25     private static int maxSub(int [] array,int left,int right){
26         if(left==right){
27             if (array[left]>0)
28                return array[left];
29             else
30                return 0;
31         }
32         int center= (left+right)/2;
33         //前两种情况用递归
34         int leftMax=maxSub(array,left,center);
35         int rightMax=maxSub(array,center+1,right);
36
37         //后一种情况用两个for循环
38         int leftBorderMax=0; int leftBorderSum=0;
39         for(int i=center;i>=left;i--){
40             leftBorderSum+=array[i];
41             if(leftBorderSum>leftBorderMax){
42                 leftBorderMax=leftBorderSum;
43             }
44         }
45         int rightBorderMax=0; int rightBorderSum=0;
46         for(int i=center+1;i<=right;i++){
47             rightBorderSum+=array[i];
48             if(rightBorderSum>rightBorderMax){
49                 rightBorderMax=rightBorderSum;
50             }
51         }
52
53         return max3(leftMax,rightMax,leftBorderMax+rightBorderMax);
54
55     }
56
57     private static int max3(int a, int b, int c){
58         int n=a>b?a:b;
59         return c>n?c:n;
60     }
61
62 }

3 复杂度为O(N)

 1 package findmaxsub;
 2 //求最大子序列和算法3:
 3 //这个算法最巧妙,时间运行最小
 4 //基于的思想:任何最大子序列的起点项不可能为负数,那么任何负的子序列不可能是最大子序列的前缀
 5 //所以只要前面的累积和为负数了,就可以重新选择开头了
 6
 7 public class findMaxSubb {
 8
 9     /**
10      * @param args
11      */
12     public static void main(String[] args) {
13         // TODO Auto-generated method stub
14         int [] arr = new int[]{4,-3,5,-2,-1,2,6,-2};
15         System.out.println(findMax(arr));
16
17     }
18     private static int findMax(int[] arr){
19         int sum=0,maxSum=0;
20         for(int i=0;i<arr.length;i++){
21             sum+=arr[i];
22             if(sum<0)
23                 sum=0;
24             if(sum>maxSum){
25                 maxSum=sum;
26             }
27         }
28         return maxSum;
29     }
30
31 }
时间: 2024-10-29 19:11:21

每日一记,今天开始的相关文章

每日一记:搭建Memcached + php 缓存系统

服务器环境,Centos6.5 1.安装Memcached服务端 Yum -y install memcached 2.配置Memcached服务端用户以及自动启动服务等 将服务配置成自启动 chkconfig --level 2345 memcached on 3.配置配置文件 vi /etc/sysconfig/memcached PORT=”11211″ 端口  USER=”root” 使用的用户名  MAXCONN=”1024″ 同时最大连接数 CACHESIZE=”64″ 使用的内存大

每日一记--2014.9.22

说好的每日一记呢, 哎,上周接到了老师的任务,要把项目中的后台数据处理代码读懂,于是就没有时间每天搞段小代码来写写了. 但是通过这一周,自己也学到了不少东西. 1. 首先是如何读别人写的代码: 先看 improt 大概用到什么类: 然后看main,有什么变量的初始化(有的写在一个init函数里了): 找到核心类,核心函数(调用了其他函数的函数),看其实现主要功能流程 . 最后再看其他那些被调用的函数,它们的具体实现细节. 2. 其次是如何给别人讲代码,做code review: 先讲其实现的功能

每日一记:邮件服务器:Postfix

邮件服务器:Postfixmail server与DNS的关系:1.架设mail server 必须要有合法的主机名2.DNS的反解也很重要要架设一部mail server,务必向上层ISP申请IP反解的对应,不要使用预设的反解主机名,否则会是你的邮件服务器发出的信件被视为垃圾信件不申请IP的反解,则可利用relayhost或者是smarthost来处理邮件传递的问题,也涉及到上层ISP的问题3.需要DNS的MX及A标准:先传送给带MAX标志的邮件主机,如果没有再传给带A标志的主机:MAX标志的

iOS每日一记------------之 中级完美大整理

iOS.mac开源项目及库汇总 UI 下拉刷新 EGOTableViewPullRefresh – 最早的下拉刷新控件. SVPullToRefresh – 下拉刷新控件. MJRefresh – 仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉刷新功能.可以自定义上下拉刷新的文字说明.具体使用看"使用方法". (国人写) XHRefreshControl – XHRefreshControl 是一款高扩展性.低耦合度的下拉刷新.上提加载更

iOS每日一记之——————————iOS性能优化

写在前面 本文来自iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员.这是他的个人网站:http://www.marcelofabri.com/,你还可以在Twitter上关注@marcelofabri_. 性能对 iOS 应用的开发尤其重要,如果你的应用失去反应或者很慢,失望的用户会把他们的失望写满App Store的评论.然而由于iOS设备的限制,有时搞好性能是一件难事.开发过程中你会有很多需要注意的事项,你也很容易在做出选择时忘记考虑

JAVA每日一记

1.两个最基本的java回收算法:复制算法和标记清理算法 复制算法:两个区域A和B,初始对象在A,继续存活的对象被转移到B.此为新生代最常用的算法 标记清理:一块区域,标记要回收的对象,然后回收,一定会出现碎片,那么引出 标记-整理算法:多了碎片整理,整理出更大的内存放更大的对象 两个概念:新生代和年老代 新生代:初始对象,生命周期短的 永久代:长时间存在的对象 整个java的垃圾回收是新生代和年老代的协作,这种叫做分代回收. P.S:Serial New收集器是针对新生代的收集器,采用的是复制

Laravel每日一记

近期在用laravel开发项目,越用感觉越方便,虽说官网说明文档内容有点少,但是实用的还是有的. 今天应要求把请求的错误记录进日志里面,一开始我是直接在start/global.php 下加入Log::error($exception),然后改了下请求的返回参数,错误如期出现,然而并没有看见错误的记录写进日志里面,日志文件也是在global文件里面配置的. 后来才想起我已经在app/errors.php配置了500与404的处理,并且返回了错误页面,所以不能执行到global下的日志操作,于是在

每日一记--2014.9.15

今天的程序还有待改进,写的可能比较冗长了,虽然逻辑不难,自己也是debug了一会儿. 问题是:找数值中的主元素,即个数超过半数的元素. 首先找出唯一的一个候选元素,然后再遍历数值统计其个数,看是否大于数组长度的二分之一,如大于则返回此主元素,若小于则表明没有主元素那么返回-1(假设数组中的数均为正整数). 如何寻找唯一的候选元素: 1.利用递归 2.为找出A中的候选元,先构造B.逐次比较A中的两个元素:比较A1和A2,若相等,则放入B:否则什么也不做.然后比较A3和A4,若相等,则放入B:否则什

每日一记--2014.9.13

今天贴三个小程序,程序很小,但是希望这些小东西都能记在心里 1.求多项式 1 package 多项式; 2 3 public class Polynomial { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 int[] xishu = new int[]{2,1,0,8,4}; 8 System.out.println(poly(xishu,3)); 9 10 } 11 p

每日一记

昨天晚上在实验室度过圣诞夜晚,感觉真是不错哦.计算每隔一天可以在实验一晚上. 上午到计算中心会议室听了明年要毕业的研三学长的毕业预答辩.虽然总体很水,还是要 认真的准备一段时间的才能有所创新. 下午继续Android的学习,总体的知识建构基本上已经很清晰了.下一阶段应该reading resource code 为主.晚上看了Stanford university <编程范式>的第三节.对于c语言的指针有了更深入的认识. 计划缩短Android的学习时间, 抽出时间学习<STL 源码剖析