最大非负的序列和
2015-12-08 09:57
288 查看
第一种方法:设定一个从i开始的计数,然后再以j为起点,k不断变化,算和算法复杂度是o(N*N*N)
第二种是第一种的改进算法复杂度是O(N*N)
第三中是最直接的 。算法复杂度是O(N) 它隐藏着条件。从正数开始,如果和为0就重新开始计算。
第四种方式,递归。时间复杂度是 O(NlogN)
递归算法的时间复杂度怎么计算呢?
参考他的文章,真的很棒。http://blog.csdn.net/budapest/article/details/6367973/
重点说下递归。
说实话我也不太清楚多次递归,一直很困惑,通过输出检测,发现递归函数实际上始终只有一个递归栈的。
?
这个数组其实会被不断的运算直到左边=右边
数组的计算过程是 06 的左边 03和4,6
03又被解析成01和23 然后01被分解成00和11
递归真是一个有意思的东西哦。
#include <stdio.h>
int get_max_in_three(int a,int b,int c){
if(a > b){
if(a > c){
return a;
}else{
return c;
}
}else{
if( b > c){
return b;
}else{
return c;
}
}
}
int bestqueue(int *arr ,int left,int right){
int i,center;
int left_max,right_max;
int left_bord_sum,left_bord_max;
int right_bord_sum,right_bord_max;
if(left == right){
if(arr[left] > 0){
return arr[left];
}
else
{
return 0 ;
}
}
center = (left + right)/2;
left_max = bestqueue(arr,left,center);
right_max = bestqueue(arr,center+1,right);
left_bord_sum = left_bord_max = 0;
for(i=center;i>=left;i--){
left_bord_sum += arr[i];
if(left_bord_sum > left_bord_max){
left_bord_max = left_bord_sum;
}
}
right_bord_sum = right_bord_max = 0;
for(i=center+1;i<=right;i++){
right_bord_sum += arr[i];
if(right_bord_sum > right_bord_max){
right_bord_max = right_bord_sum;
}
}
return get_max_in_three(left_max,left_bord_max+right_bord_max,right_max);
}
int maxqueue_qute(int arr[],int len){
int i,j,k,sum,max;
max = 0;
for(i=0;i<len;i++){
for(j=i;j<len;j++){
sum = 0;
for(k=i;k<=j;k++){
sum += arr[k];
}
if(sum > max){
max = sum;
}
}
}
return max;
}
int maxqueue_qute_more(int arr[],int len){
int i,j,sum,max;
max = 0;
for(i=0;i<len;i++){
sum = 0;
for(j=i;j<len;j++){
sum += arr[j];
if(sum > max){
max = sum;
}
}
}
return max;
}
int maxqueue_qute_fast(int arr[],int len){
int i,max,sum;
max = sum = 0;
for(i=0;i<len;i++){
sum += arr[i];
if(sum < 0 ){
sum = 0;
}
if(sum > max){
max = sum;
}
}
return max;
}
int main(int argc, char const *argv[])
{
int max;
int arr[7] = {2,-1,3,-4,1,2,-3};
printf("%d\n", maxqueue_qute(arr,7));
printf("%d\n", maxqueue_qute_more(arr,7));
printf("%d\n", maxqueue_qute_fast(arr,7));
printf("%d\n", maxqueue_rec(arr,0,6));
printf("%d\n", bestqueue(arr,0,6));
printf("end");
return 0;
}
第二种是第一种的改进算法复杂度是O(N*N)
第三中是最直接的 。算法复杂度是O(N) 它隐藏着条件。从正数开始,如果和为0就重新开始计算。
第四种方式,递归。时间复杂度是 O(NlogN)
递归算法的时间复杂度怎么计算呢?
参考他的文章,真的很棒。http://blog.csdn.net/budapest/article/details/6367973/
重点说下递归。
说实话我也不太清楚多次递归,一直很困惑,通过输出检测,发现递归函数实际上始终只有一个递归栈的。
?
数组的计算过程是 06 的左边 03和4,6
03又被解析成01和23 然后01被分解成00和11
递归真是一个有意思的东西哦。
#include <stdio.h>
int get_max_in_three(int a,int b,int c){
if(a > b){
if(a > c){
return a;
}else{
return c;
}
}else{
if( b > c){
return b;
}else{
return c;
}
}
}
int bestqueue(int *arr ,int left,int right){
int i,center;
int left_max,right_max;
int left_bord_sum,left_bord_max;
int right_bord_sum,right_bord_max;
if(left == right){
if(arr[left] > 0){
return arr[left];
}
else
{
return 0 ;
}
}
center = (left + right)/2;
left_max = bestqueue(arr,left,center);
right_max = bestqueue(arr,center+1,right);
left_bord_sum = left_bord_max = 0;
for(i=center;i>=left;i--){
left_bord_sum += arr[i];
if(left_bord_sum > left_bord_max){
left_bord_max = left_bord_sum;
}
}
right_bord_sum = right_bord_max = 0;
for(i=center+1;i<=right;i++){
right_bord_sum += arr[i];
if(right_bord_sum > right_bord_max){
right_bord_max = right_bord_sum;
}
}
return get_max_in_three(left_max,left_bord_max+right_bord_max,right_max);
}
int maxqueue_qute(int arr[],int len){
int i,j,k,sum,max;
max = 0;
for(i=0;i<len;i++){
for(j=i;j<len;j++){
sum = 0;
for(k=i;k<=j;k++){
sum += arr[k];
}
if(sum > max){
max = sum;
}
}
}
return max;
}
int maxqueue_qute_more(int arr[],int len){
int i,j,sum,max;
max = 0;
for(i=0;i<len;i++){
sum = 0;
for(j=i;j<len;j++){
sum += arr[j];
if(sum > max){
max = sum;
}
}
}
return max;
}
int maxqueue_qute_fast(int arr[],int len){
int i,max,sum;
max = sum = 0;
for(i=0;i<len;i++){
sum += arr[i];
if(sum < 0 ){
sum = 0;
}
if(sum > max){
max = sum;
}
}
return max;
}
int main(int argc, char const *argv[])
{
int max;
int arr[7] = {2,-1,3,-4,1,2,-3};
printf("%d\n", maxqueue_qute(arr,7));
printf("%d\n", maxqueue_qute_more(arr,7));
printf("%d\n", maxqueue_qute_fast(arr,7));
printf("%d\n", maxqueue_rec(arr,0,6));
printf("%d\n", bestqueue(arr,0,6));
printf("end");
return 0;
}
相关文章推荐
- 一次搞定所有定时任务
- 面试算法——6.Mingo Game
- android(42)(音乐播放器,视频播放器)
- PHP 留言板功能需求分析
- Android Studio 1.0.2 设置内存大小
- 《C和指针》章节后编程练习解答参考——第8章
- Struts2的OGNL标签详解
- MapReduce输入输出类型对应关系
- 【转】Android Studio 的小小配置
- javaweb开发-js代码中keypress事件调用判断,取得keyCode值
- SQL2008附加数据库报错
- 更改进程的IE兼容模式
- 【转】c#中关于文件的操作
- MyEclipse10.7的 at com.genuitec.eclipse.ast.deploy.core.Deployment.<init>异常解决方法
- JS组件Bootstrap Table表格行拖拽效果实现代码
- git入门教程
- 内存对齐的规则以及作用
- 色彩转换的基础知识
- Afnetworking+nginx+https服务器通信
- Android进程的内存管理分析