分治策略 | 最大子数组问题
来源:互联网 发布:高达钢材软件 编辑:程序博客网 时间:2024/05/22 12:45
分治策略 就是把一个大问题递归地分解成规模较小的子问题,子问题的规模可能不等。
最大子数组问题,找数组A中和最大的连续段A[i, .., j]。A中要有负数这个问题才有意义。
伪代码:
(跨中点的情况)
(完全在原数组左边或右边的情况)
C++代码:
#include <iostream>using namespace std;struct maxSubarray {int low;int high;int sum;};maxSubarray findMaxCrossingSubarray(int* arr, int low, int mid, int high){int sum = 0;int leftSum = -65535;int rightSum = -65535;maxSubarray crossSub;crossSub.low = low;crossSub.high = high;for (int i = mid; i >= low; i--){sum += arr[i];if (sum > leftSum){leftSum = sum;crossSub.low = i;}}sum = 0;for (int i = mid + 1; i <= high; i++){sum += arr[i];if (sum > rightSum){rightSum = sum;crossSub.high = i;}}crossSub.sum = leftSum + rightSum;return crossSub;}maxSubarray findMaxmumSubarray(int* arr, int low, int high, int sum){if (low == high){maxSubarray sub;sub.low = low;sub.high = high;sub.sum = arr[low];return sub;}else{int mid = (low + high) / 2;maxSubarray leftSub;leftSub = findMaxmumSubarray(arr, low, mid, sum);maxSubarray rightSub;rightSub = findMaxmumSubarray(arr, mid + 1, high, sum);maxSubarray crossSub;crossSub = findMaxCrossingSubarray(arr, low, mid, high);if (leftSub.sum >= rightSub.sum && leftSub.sum >= crossSub.sum)return leftSub;else if (rightSub.sum >= leftSub.sum && rightSub.sum >= crossSub.sum)return rightSub;else if (crossSub.sum >= leftSub.sum && crossSub.sum >= rightSub.sum)return crossSub;}}int main(){int A[10] = { 4, 5, 7, -2, -3, -6, -1, 9, -2, 4 };maxSubarray maxSub;maxSub = findMaxmumSubarray(A, 0, sizeof(A) / sizeof(A[0]) - 1, -65535);cout << maxSub.low << "," << maxSub.high << "," << maxSub.sum << endl;return 0;}
---------- 更新分治策略写法 (上面的代码是何等的woc...) ----------
int maxSubArray(vector<int>& nums) { if (nums.empty()) return 0; return findMaxSubArray(nums, 0, nums.size() - 1);}int findMaxSubArray(vector<int>& nums, int left, int right) { if (left >= right) return nums[left]; int mid = left + (right - left) / 2; int lmax = findMaxSubArray(nums, left, mid - 1); int rmax = findMaxSubArray(nums, mid + 1, right); int mmax = nums[mid], temp = mmax; //跨中点数组 for (int i = mid - 1; i >= left; --i) { temp += nums[i]; mmax = max(mmax, temp); } temp = mmax; for (int i = mid + 1; i <= right; ++i) { temp += nums[i]; mmax = max(mmax, temp); } return max(mmax, max(lmax, rmax));}
阅读全文
0 0
- 分治策略之最大子数组问题
- 【分治策略】最大子数组问题
- 分治策略求解最大子数组问题
- 分治策略之最大子数组问题
- 分治策略-最大子数组问题
- 分治策略之最大子数组问题
- 分治策略 | 最大子数组问题
- 分治策略之最大子数组问题
- 分治策略之最大子数组问题
- 分治策略 & 最大子数组的问题
- 最大子数组----分治策略
- 算法导论_最大子数组问题(分治策略)
- 算法导论_最大子数组问题(分治策略)
- 最大子数组问题(第4章:分治策略)
- 分治策略__解决最大连续子数组的问题
- 算法导论:分治策略__最大子数组问题
- 分治策略——最大子数组问题
- 算法导论之分治策略:最大子数组问题
- qmake手册——平台笔记
- 完全函数依赖和部分函数依赖
- XListView 展示刷新与加载
- 复制字符串小程序笔记
- Gym 101128H想法题
- 分治策略 | 最大子数组问题
- 自定义Dialog, Toast提示
- 2729: [HNOI2012]排队
- 欢迎使用CSDN-markdown编辑器
- 机器学习:在Android中集成TensorFlow (深度学习,AI,人工智能,DL,ML,神经网络)
- MVC,MVP 和 MVVM
- UVA 10721 Bar Codes(容斥原理)
- Nginx配置文件详解
- 做用户体验设计,你不得不知的18件事