434
社区成员
发帖
与我相关
我的任务
分享
int maxSubArray(int arr[], int left, int right) { if (left == right) { return arr[left]; } int mid = (left + right) / 2; int leftMax = maxSubArray(arr, left, right); int rightMax = maxSubArray(arr, mid + 1, right); int crossMax = maxCrossingSubArray(arr, left, mid, right); return max(leftMax, rightMax, crossMax); } int maxCrossingSubArray(int arr[], int left, int mid, int right) { int leftSum = INT_MIN; int sum = 0; for (int i = mid; i >= left; i--) { sum += arr[i]; leftSum = max(leftSum, sum); } int rightSum = INT_MIN; sum = 0; for (int i = mid + 1; i <= right; i++) { sum += arr[i]; rightSum = max(rightSum, sum); } return leftSum + rightSum; }
该最大字段和的分治算法的时间复杂度为O(n log n)。算法将问题分成两部分,递归求解,然后再合并结果。每次分解问题的时间复杂度为O(log n),而合并的时间复杂度为O(n),因此总的时间复杂度为O(n log n)
分治法所能解决的问题一般具有以下几个特征:
1、该问题的规模缩小到一定的程度就可以容易地解决。
2、该问题可以分解为若干个规模较小的相同问题。
3、利用该问题分解出的子问题的解可以合并为该问题的解。
4、该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
故可以分以下几步利用分治法解决问题:
1、分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题。
2、求解子问题:若子问题规模较小而容易被解决则直接求解,否则递归地求解各个子问题。
3、合并:将各个子问题的解合并为原问题的解。