分治策略之最大子数组问题
2017-08-02 15:22
351 查看
问题描述:
问题:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该连续子数组中各元素的和最大,这个连续子数组便被称作最大连续子数组。比如数组{2,4,-7,5,2,-1,2,-4,3}的最大连续子数组为{5,2,-1,2},最大连续子数组的和为5+2-1+2=8。
解问题:
一、暴力解法:#include<iostream> using namespace std; class solution { public: int FIND_MAXMUM_SUBARRAY(int A[], int length) { int i, j; int sum = 0; for (i = 0; i < length; i++) { int cursum = 0; for (int j = i; j < length; j++) { cursum += A[j]; if (cursum > sum) { sum = cursum; } } } return sum; } }; int main() { int A[9] = { -1,2,-5,3,2,7,3,-2,-3 }; solution S1; cout << S1.FIND_MAXMUM_SUBARRAY(A, 9); system("pause"); }
二、分治解法:
#include<iostream> using namespace std; class solution { public: int FIND_MAXMUM_SUBARRAY(int A[],int low,int high) { if (low == high) return A[low]; else { int mid = (low + high) / 2; int leftmax, rightmax, crossmax; leftmax = FIND_MAXMUM_SUBARRAY(A, low, mid); rightmax = FIND_MAXMUM_SUBARRAY(A, mid + 1, high); crossmax = findcross(A, low, high); if (leftmax >= rightmax&&leftmax >= crossmax) { return leftmax; } else if (rightmax >= leftmax&&rightmax >= crossmax) { return rightmax; } else return crossmax; } } int findcross(int A[],int low,int high) { int left_sum = -1000; int sum = 0; int right_sum = -1000; int mid = (low + high) / 2; for (int i = mid; i>=0; i--) { sum += A[i]; if (sum > left_sum) { left_sum = sum; } } sum = 0; for (int i = mid + 1; i <=high; i++) { sum = sum + A[i]; if (sum > right_sum) { right_sum = sum; } } return left_sum + right_sum; } }; int main() { int A[9] = { -1,2,-5,3,2,7,3,-2,-3 }; solution S1; cout<<S1.FIND_MAXMUM_SUBARRAY(A, 0,8); system("pause"); }
三 、线性解法:
#include<iostream> /* @author zsj */ using namespace std; int find(int a[], int length) { int temp=0; int max=0; for (int i = 0; i < length; i++) { temp += a[i]; if (temp > max) max = temp; if (temp < 0) temp = 0; } }
相关文章推荐
- 最大子数组问题(分治策略实现)
- 分治策略解决最大子数组问题
- 算法导论 最大子数组问题(分治策略)
- 分治策略__解决最大连续子数组的问题
- 分治策略-最大子数组问题
- 算法导论--分治策略求解最大子数组问题
- 算法导论_最大子数组问题(分治策略)
- 分治策略 & 最大子数组的问题
- 分治策略求解最大子数组问题
- 算法导论_最大子数组问题(分治策略)
- 最大子数组问题-分治策略解法
- 第四章 分治策略 最大子数组问题
- 【分治策略】最大子数组问题
- 分治策略之最大子数组问题
- 体验结对开发的乐趣(5)--(首尾相连的二维数组求最大子数组和的问题)
- 数组中子数组之和最大问题
- 二维数组, 二分法查找数组元素下标 快速查找数组最大值 数组作为实参的问题
- 最大子数组问题
- [数据结构与算法分析] 求连续子数组的最大和问题
- 经典算法——连续子数组最大和问题