【Leetcode】寻找数串中连续最大整数和且最大长度的子串
2014-06-03 20:41
513 查看
寻找数串中连续最大整数和且最大长度的子串
输入示例:
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
1.最大和数串位于a[mid]左边数串中;
2.最大和数串位于a[mid]右边数串中;
3.最大和数串包括a[mid]。
明显地,情况1,2是原问题的子问题,但情况3则并不是原问题子问题,因为它有条件限制,所以我们需要另外求解。
由JULY博客提供的方法,可以大大简化代码的时间复杂度,变为线性复杂度O(n),且空间复杂度为O(1)
其代码为:
输入示例:
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
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】寻找数串中连续最大整数和且最大长度的子串
- 【LeetCode】寻找最大长度不重复子串
- leetcode寻找最大长度的连续数对
- Java寻找最大连续子串和
- [leetcode]53. Maximum Subarray 最大连续子串python实现【medium】
- 寻找数组中的最大连续子串
- 任意整数 ,输出从大到小,连续的去最大最小。 最大长度不超过1024;
- 给定整数序列求连续子串最大和 - 滴滴出行2018校园招聘内推笔试-研发工程师
- 寻找最大连续子串和
- leetcode_[Python/C++]_3_Longest Substring Without Repeating Characters(不重复子串最大长度)
- 字符串中不重复连续字符子串的长度最大值
- 寻找最大连续子串和
- [leetcode]53. Maximum Subarray 最大连续子串python实现【medium】
- 寻找和最大的连续子串
- LeetCode | 673. Number of Longest Increasing Subsequence中等偏难题 找寻数组里面最大长度的子串的个数
- 统计字符串中连续出现某些字符的最大子串长度
- leetcode_424. Longest Repeating Character Replacement 求替换k个字符后连续相同字符子串的长度,滑动窗口的应用
- leetcode Max Consecutive Ones 最大连续长度
- 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<
- LeetCode系列字符串操作(一)ZigZag输出,寻找最大不重复字串长度。