【Leetcode】寻找数串中连续最大整数和且最大长度的子串
寻找数串中连续最大整数和且最大长度的子串
输入示例:
1000 -100 200 -200 100 -100 10 90
输出结果:
1100
分析:
分治法解决问题非常方便,依然分为三种情况:a[1], a[2]......a[mid-1], a[mid], a[mid+1]......a[n-1], a[n]
1.最大和数串位于a[mid]左边数串中;
2.最大和数串位于a[mid]右边数串中;
3.最大和数串包括a[mid]。
明显地,情况1,2是原问题的子问题,但情况3则并不是原问题子问题,因为它有条件限制,所以我们需要另外求解。
#include <stdio.h>
#include <stdlib.h> struct ansmax{
int lindex;
int hindex;
int summax;
};
typedef struct ansmax ans; int find_cross_max(int *data, int mid, int lindex, int hindex, ans* max){ //计算经过中间点的最大和数串
int leftmax, rightmax;
int maxtemp,maxt;
int k; for(k=mid, maxtemp=0, maxt=-100000, leftmax=mid; k>=lindex; k--){ //maxt=负无穷
maxtemp += *(data+k);
if(maxtemp>maxt){
maxt=maxtemp;
leftmax=k;
}
}
for(k=mid, maxtemp=0, maxt=-100000, rightmax=mid; k<=hindex; k++){
maxtemp += *(data+k);
if(maxtemp>maxt){
maxt=maxtemp;
rightmax=k;
}
} //返回经过最大值
for(k=leftmax, max->summax=0; k<=rightmax; k++){
max->summax += *(data+k);
max->lindex = leftmax;
max->hindex = rightmax;
}
} void findmax(int *data, int lindex, int hindex, ans* max){
ans crossmax;
ans leftmaxsum, rightmaxsum;
int mid; if(lindex==hindex){
max->hindex=hindex;
max->lindex=lindex;
max->summax=*(data+lindex);
return;
}
mid=(lindex+hindex)/2;
if(mid-1>=lindex)
findmax(data, lindex, mid-1, &leftmaxsum);
else
leftmaxsum.summax = -100000; //应该设置为负最大值
if(mid+1<=hindex)
findmax(data, mid+1, hindex, &rightmaxsum);
else
rightmaxsum.summax = -100000; //应该设置为负最大值
find_cross_max(data, mid, lindex, hindex, &crossmax);
if(leftmaxsum.summax>rightmaxsum.summax&&leftmaxsum.summax>crossmax.summax){
max->summax = leftmaxsum.summax;
max->lindex = leftmaxsum.lindex;
max->hindex = leftmaxsum.hindex;
}
else if(rightmaxsum.summax>leftmaxsum.summax&&rightmaxsum.summax>crossmax.summax){
max->summax = rightmaxsum.summax;
max->lindex = rightmaxsum.lindex;
max->hindex = rightmaxsum.hindex;
}
else{
max->summax = crossmax.summax;
max->lindex = crossmax.lindex;
max->hindex = crossmax.hindex;
}
} int main(void){
int datalen;
int *dataptr;
int k, sum1, sumtemp1, sum2, sumtemp2;
int *maxtail, *maxhead, *curptr;
ans myans; printf("input datalen:"); scanf("%d",&datalen);
if(datalen<=0) return 0;
if((dataptr=(int*)malloc(sizeof(int)*datalen))==NULL){
printf("malloc failed\n");
exit(0);
}
for(k=0; k<datalen; k++){
printf("input data %d/%d:", k+1, datalen);
scanf("%d", dataptr+k);
} findmax(dataptr, 0, datalen-1, &myans);
for(k=myans.lindex; k<=myans.hindex; k++){
printf("%d ", *(dataptr+k));
}
printf("\n%d\n", myans.summax); system("pause");
return 0;
}
由JULY博客提供的方法,可以大大简化代码的时间复杂度,变为线性复杂度O(n),且空间复杂度为O(1)
其代码为:
#include <stdio.h>
#include <stdlib.h> int maxsum(int a[],int n)
{
int max=a[0]; //全负情况,返回最大数
int sum=0;
int j;
for(j=0;j<n;j++)
{
if(sum>=0) //如果加上某个元素,sum>=0的话,就加
sum+=a[j];
else
sum=a[j]; //如果加上某个元素,sum<0了,就不加,这里就不清零了
if(sum>max)
max=sum;
}
return max;
} int main(void){
int n, k;
int *a; scanf("%d", &n);
a = (int*)malloc(sizeof(int));
for(k=0; k<n; k++){
scanf("%d", a+k);
} printf("%d\n", maxsum(a,n)); system("pause");
return 0;
}
【Leetcode】寻找数串中连续最大整数和且最大长度的子串的更多相关文章
- 485. 找出二进制串中连续的1的个数 Max Consecutive Ones
Given a binary array, find the maximum number of consecutive 1s in this array. Example 1: Input: [1, ...
- HDU 2087 剪花布条(模式串在主串中出现的次数主串中子串不可重叠)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 题意:求模式串在主串中出现的次数,与模式串匹配的子串之间不可重叠. 思路:用kmp算法解决,在匹 ...
- [LeetCode]丑数 II&C++中priority_queue和unordered_set的使用
[LeetCode]丑数 II&C++中priority_queue和unordered_set的使用 考虑到现实因素,LeetCode每日一题不再每天都写题解了(甚至有可能掉题目?--)但对 ...
- poj3080Blue Jeans(在m个串中找到这m个串的 最长连续公共子序列)
Description The Genographic Project is a research partnership between IBM and The National Geographi ...
- 读入一个字符串str,输出字符串str中连续最长的数字串
要求: 读入一个长度不超过256的字符串,例如“abc123defg123456789hjfs123456”.要求输出“123456789” 思路: 遍历字符串,如果是数字串则计算往后一共有多少个数字 ...
- ZT 查找字符串中连续最长的数字串
查找字符串中连续最长的数字串 有俩方法,1)比较好理解一些.2)晦涩 1) /* 功能:在字符串中找出连续最长的数字串,并把这个串的长度返回, 并把这个最长数字串付给其中一个函数参数outputstr ...
- HDU 6084 寻找母串(卡特兰数)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6084 [题目大意] 对于一个串S,当它同时满足如下条件时,它就是一个01偏串: 1.只由0和1两种 ...
- LeetCode:乘法表中的第K小的数【668】
LeetCode:乘法表中的第K小的数[668] 题目描述 几乎每一个人都用 乘法表.但是你能在乘法表中快速找到第k小的数字吗? 给定高度m .宽度n 的一张 m * n的乘法表,以及正整数k,你需要 ...
- LeetCode Reverse Words in a String 将串中的字翻转
class Solution { public: void reverseWords(string &s) { string end="",tem="" ...
随机推荐
- C# Directory类
Directory类 是一个静态类,常用的地方为创建目录和目录管理. 一下来看看它提供的操作. 1.CreateDirectory 根据指定路径创建目录.有重载,允许一次过创建多个目录. 2.Dele ...
- 超大批量删除redis中无用key+配置
目前线上一个单实例redis中无用的key太多,决定删除一部分. 1.删除指定用户的key,使用redis的pipeline 根据一定条件把需要删除的用户统计出来,放到一个表里面,表为 del_use ...
- bzoj3407 [Usaco2009 Oct]Bessie's Weight Problem 贝茜的体重问题
Description 贝茜像她的诸多姊妹一样,因为从约翰的草地吃了太多美味的草而长出了太多的赘肉.所以约翰将她置于一个及其严格的节食计划之中.她每天不能吃多过H(5≤日≤45000)公斤的干 ...
- 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.0
/** * 百度地图使用工具类-v1.5 * * @author boonya * @date 2013-7-7 * @address Chengdu,Sichuan,China * @email b ...
- STL源码剖析读书笔记之vector
STL源码剖析读书笔记之vector 1.vector概述 vector是一种序列式容器,我的理解是vector就像数组.但是数组有一个很大的问题就是当我们分配 一个一定大小的数组的时候,起初也许我们 ...
- PHP MySQL 创建数据库和表 之 Create
创建数据库 CREATE DATABASE 语句用于在 MySQL 中创建数据库. 语法 CREATE DATABASE database_name 为了让 PHP 执行上面的语句,我们必须使用 my ...
- Ehcache RIM
Ehcache不仅支持基本的内存缓存,还支持多种方式将本地内存中的缓存同步到其他使用Ehcache的服务器中,形成集群.如下图所示: Ehcache支持多种集群方式,下面以RMI通信方式为例,来具 ...
- cocos2dx 3.1从零学习(三)——Touch事件(回调,反向传值)
第三讲 Touch 前面两篇我们学习的内容,足够我们做一款简单的小游戏.也能够说,我们已经入门了,能够蹒跚的走路了. 本篇将解说cocos2dx中非常重要的touch回调机制.你肯定记得第一章做定时器 ...
- Repeater动态添加行
<table class="table table-striped table-bordered table-hover"> <asp:Re ...
- synchronized关键字的用法
synchronized用于给方法或者块加锁用的,只有获得该对象或者块的锁的对象才能够执行里面的代码,否则将阻塞在那里,等待该锁被释放,然后获得该锁继续执行.比如下面模拟售票的代码: /** * 模拟 ...