最大子数组
来源:互联网 发布:jquery遍历json对象 编辑:程序博客网 时间:2024/06/05 17:47
/*函数:最大子数组 从一组数字总选取和最大的非空连续子数组 注意:只有当数组中含有负数时,才有意义算法复杂度 n*lognT(n)=2T(n/2)+O(n)如果从中选择任意两个(开始和结束点),复杂度为 n^2时间:15.7.12 Jason Zhou 热爱你所写下的程序,他是你的伙伴,而不是工具.*/#include <iostream>using namespace std;typedef struct subarr_struct{ int low; int high; int sum;};//从 [X,mid] 和 [mid+1,Y]中找出最大的和,进行相加.subarr_struct find_crossing_subarray(int arr[],int low,int mid,int high){ int left_sum=arr[mid]-1; int sum=0; int left_pos; for (int i=mid;i>=0;i--) { sum+=arr[i]; if (sum>left_sum) { left_sum=sum; left_pos=i; } } int right_sum=arr[mid+1]-1; int right_pos; sum=0; for (int j=mid+1;j<=high;j++) { sum+=arr[j]; if (sum>right_sum) { right_sum=sum; right_pos=j; } } subarr_struct cross_str; cross_str.low=left_pos; cross_str.high=right_pos; cross_str.sum=left_sum+right_sum; return cross_str;}subarr_struct find_maxnum_sumarray(int arr[],int low,int high){ subarr_struct min_struct; subarr_struct left_struct; subarr_struct right_struct; subarr_struct cross_struct; if (low==high) { min_struct.low=low; min_struct.high=high; min_struct.sum=arr[low]; return min_struct; } else { int mid=(low+high)/2; left_struct=find_maxnum_sumarray(arr,low,mid); right_struct=find_maxnum_sumarray(arr,mid+1,high); cross_struct=find_crossing_subarray(arr,low,mid,high); } if ( (left_struct.sum>right_struct.sum)&&(left_struct.sum>cross_struct.sum) ) { return left_struct; }else if (right_struct.sum>cross_struct.sum) { return right_struct; }else { return cross_struct; }}int main(void){ int a[] = {13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7}; int len=sizeof(a)/sizeof(a[0]); for (int i = 0; i < len; i++) cout<<a[i]<<" "; cout<<endl; subarr_struct find_struct; find_struct=find_maxnum_sumarray(a,0,len-1); cout<<"low="<<find_struct.low<<" high="<<find_struct.high<<" sum="<<find_struct.sum<<endl; return 0;}
0 0
- 求最大子数组
- 求最大子数组
- 子数组和最大
- 求最大子数组
- 最大子数组
- 最大子数组和
- 最大子数组和
- 子数组最大和
- 子数组最大乘积
- 最大子数组
- 最大子数组乘积
- 最大子数组和
- 子数组最大和
- 子数组最大和
- 最大子数组二
- 最大连续子数组
- 最大子数组问题
- 最大子数组算法
- 黑马程序员—IOS基础之OC—类的三大特性封装、继承、多态
- iOS-架构项目
- poj1087解题报告(最大流 EK算法)
- JAVA WEB 乱码
- c++引用与指针的区别(着重理解)
- 最大子数组
- cocos2dx笛卡尔坐标
- OpenCV2.3.1+Python2.7.3+Numpy等的配置
- linux-制作linux启动U盘
- Git上传项目代码到github
- 【Android】setAdapter()与notifyDataSetChanged()对比
- Binary Tree Level Order Traversal II
- 【Leetcode】String to Integer(ATOI)
- ZOJ-3805-Machine